|
@@ -3,6 +3,8 @@ package com.kym.service.impl;
|
|
|
import cn.dev33.satoken.stp.StpUtil;
|
|
import cn.dev33.satoken.stp.StpUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.kym.common.utils.CommUtil;
|
|
import com.kym.common.utils.CommUtil;
|
|
|
|
|
+import com.kym.entity.SplitRecord;
|
|
|
|
|
+import com.kym.entity.User;
|
|
|
import com.kym.entity.WashDevice;
|
|
import com.kym.entity.WashDevice;
|
|
|
import com.kym.entity.WashOrder;
|
|
import com.kym.entity.WashOrder;
|
|
|
import com.kym.entity.queryParams.StatQueryParam;
|
|
import com.kym.entity.queryParams.StatQueryParam;
|
|
@@ -29,10 +31,13 @@ public class StatServiceImpl implements StatService {
|
|
|
private final UserService userService;
|
|
private final UserService userService;
|
|
|
private final WashOrderService washOrderService;
|
|
private final WashOrderService washOrderService;
|
|
|
private final WashDeviceService washDeviceService;
|
|
private final WashDeviceService washDeviceService;
|
|
|
- public StatServiceImpl(UserService userService, WashOrderService washOrderService, WashDeviceService washDeviceService) {
|
|
|
|
|
|
|
+ private final SplitRecordService splitRecordService;
|
|
|
|
|
+ public StatServiceImpl(UserService userService, WashOrderService washOrderService, WashDeviceService washDeviceService,
|
|
|
|
|
+ SplitRecordService splitRecordService) {
|
|
|
this.userService = userService;
|
|
this.userService = userService;
|
|
|
this.washOrderService = washOrderService;
|
|
this.washOrderService = washOrderService;
|
|
|
this.washDeviceService = washDeviceService;
|
|
this.washDeviceService = washDeviceService;
|
|
|
|
|
+ this.splitRecordService = splitRecordService;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -80,7 +85,7 @@ public class StatServiceImpl implements StatService {
|
|
|
var endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
|
|
var endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
|
|
|
LambdaQueryWrapper<WashOrder> wrapper = new LambdaQueryWrapper<>();
|
|
LambdaQueryWrapper<WashOrder> wrapper = new LambdaQueryWrapper<>();
|
|
|
wrapper.ge(WashOrder::getStartTime, startTime);
|
|
wrapper.ge(WashOrder::getStartTime, startTime);
|
|
|
- wrapper.gt(WashOrder::getStartTime, endTime);
|
|
|
|
|
|
|
+ wrapper.lt(WashOrder::getStartTime, endTime);
|
|
|
var list = washOrderService.list(wrapper);
|
|
var list = washOrderService.list(wrapper);
|
|
|
if (!list.isEmpty()) {
|
|
if (!list.isEmpty()) {
|
|
|
var totalSeconds = list.stream().mapToLong(WashOrder::getTotalSeconds).sum();
|
|
var totalSeconds = list.stream().mapToLong(WashOrder::getTotalSeconds).sum();
|
|
@@ -101,10 +106,10 @@ public class StatServiceImpl implements StatService {
|
|
|
var endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
|
|
var endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
|
|
|
LambdaQueryWrapper<WashOrder> wrapper = new LambdaQueryWrapper<>();
|
|
LambdaQueryWrapper<WashOrder> wrapper = new LambdaQueryWrapper<>();
|
|
|
wrapper.ge(WashOrder::getStartTime, startTime);
|
|
wrapper.ge(WashOrder::getStartTime, startTime);
|
|
|
- wrapper.gt(WashOrder::getStartTime, endTime);
|
|
|
|
|
|
|
+ wrapper.lt(WashOrder::getStartTime, endTime);
|
|
|
var list = washOrderService.list(wrapper);
|
|
var list = washOrderService.list(wrapper);
|
|
|
// 洗车人数
|
|
// 洗车人数
|
|
|
- var users = list.stream().distinct().map(WashOrder::getUserId).count();
|
|
|
|
|
|
|
+ var users = list.stream().map(WashOrder::getUserId).distinct().count();
|
|
|
return users == 0 ? 0 : (double) Math.round((double) list.size() / users * 100) / 100;
|
|
return users == 0 ? 0 : (double) Math.round((double) list.size() / users * 100) / 100;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -121,17 +126,24 @@ public class StatServiceImpl implements StatService {
|
|
|
.ge(WashOrder::getStartTime, LocalDateTime.of(LocalDate.now(), LocalTime.MIN))
|
|
.ge(WashOrder::getStartTime, LocalDateTime.of(LocalDate.now(), LocalTime.MIN))
|
|
|
.list();
|
|
.list();
|
|
|
|
|
|
|
|
- // 今日收入:V2结算方案从订单中计算
|
|
|
|
|
- var todayIncome = todayOrders.stream().filter(o -> o.getAmountReceived() != null).mapToInt(WashOrder::getAmountReceived).sum();
|
|
|
|
|
|
|
+ // 今日收入:充值收入 + 跨店收入(按 split_record 创建时间,与日统计表口径一致)
|
|
|
|
|
+ var todayIncome = splitRecordService.lambdaQuery()
|
|
|
|
|
+ .eq(SplitRecord::getToStationId, stationId)
|
|
|
|
|
+ .in(SplitRecord::getType, SplitRecord.TYPE_RECHARGE, SplitRecord.TYPE_CROSS_INCOME)
|
|
|
|
|
+ .ge(SplitRecord::getCreateTime, LocalDateTime.of(LocalDate.now(), LocalTime.MIN))
|
|
|
|
|
+ .lt(SplitRecord::getCreateTime, LocalDateTime.of(LocalDate.now().plusDays(1), LocalTime.MIN))
|
|
|
|
|
+ .list().stream().mapToInt(SplitRecord::getAmount).sum();
|
|
|
|
|
|
|
|
// 站点今日注册人数
|
|
// 站点今日注册人数
|
|
|
var todayRegistrations = userService.countDailyRegister(LocalDate.now(), stationId);
|
|
var todayRegistrations = userService.countDailyRegister(LocalDate.now(), stationId);
|
|
|
|
|
|
|
|
// 平均洗车消费单价(分)
|
|
// 平均洗车消费单价(分)
|
|
|
- var avgOrderPrice = todayOrders.isEmpty() ? 0 : (int)todayIncome/todayOrders.size();
|
|
|
|
|
|
|
+ var todayConsumptionAmount = todayOrders.stream().filter(o -> o.getAmount() != null).mapToInt(WashOrder::getAmount).sum();
|
|
|
|
|
+ var avgOrderPrice = todayOrders.isEmpty() ? 0 : todayConsumptionAmount / todayOrders.size();
|
|
|
|
|
|
|
|
// 平均洗车时长(秒)
|
|
// 平均洗车时长(秒)
|
|
|
- var avgOrderDuration = todayOrders.isEmpty() ? 0 : (int) (todayOrders.stream().filter(o -> o.getTotalSeconds() != null).mapToLong(WashOrder::getTotalSeconds).sum() / todayOrders.size());
|
|
|
|
|
|
|
+ var ordersWithDuration = todayOrders.stream().filter(o -> o.getTotalSeconds() != null).toList();
|
|
|
|
|
+ var avgOrderDuration = ordersWithDuration.isEmpty() ? 0 : (int) (ordersWithDuration.stream().mapToLong(WashOrder::getTotalSeconds).sum() / ordersWithDuration.size());
|
|
|
|
|
|
|
|
// 月度数据
|
|
// 月度数据
|
|
|
var monthOrders = washOrderService.lambdaQuery()
|
|
var monthOrders = washOrderService.lambdaQuery()
|
|
@@ -140,7 +152,12 @@ public class StatServiceImpl implements StatService {
|
|
|
.le(WashOrder::getStartTime, LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).atTime(LocalTime.MAX))
|
|
.le(WashOrder::getStartTime, LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).atTime(LocalTime.MAX))
|
|
|
.list();
|
|
.list();
|
|
|
var monthConsumptionAmount = monthOrders.stream().filter(o -> o.getAmount() != null).mapToInt(WashOrder::getAmount).sum();
|
|
var monthConsumptionAmount = monthOrders.stream().filter(o -> o.getAmount() != null).mapToInt(WashOrder::getAmount).sum();
|
|
|
- var monthIncome = monthOrders.stream().filter(o -> o.getAmountReceived() != null).mapToInt(WashOrder::getAmountReceived).sum();
|
|
|
|
|
|
|
+ var monthIncome = splitRecordService.lambdaQuery()
|
|
|
|
|
+ .eq(SplitRecord::getToStationId, stationId)
|
|
|
|
|
+ .in(SplitRecord::getType, SplitRecord.TYPE_RECHARGE, SplitRecord.TYPE_CROSS_INCOME)
|
|
|
|
|
+ .ge(SplitRecord::getCreateTime, LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).atTime(LocalTime.MIN))
|
|
|
|
|
+ .lt(SplitRecord::getCreateTime, LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).plusMonths(1).atTime(LocalTime.MIN))
|
|
|
|
|
+ .list().stream().mapToInt(SplitRecord::getAmount).sum();
|
|
|
var monthRegistrations = userService.countMonthRegister(LocalDate.now());
|
|
var monthRegistrations = userService.countMonthRegister(LocalDate.now());
|
|
|
var monthOrdersMap = washOrderService.countMonthOrders(LocalDate.now());
|
|
var monthOrdersMap = washOrderService.countMonthOrders(LocalDate.now());
|
|
|
|
|
|
|
@@ -148,13 +165,16 @@ public class StatServiceImpl implements StatService {
|
|
|
var allOrders = washOrderService.lambdaQuery()
|
|
var allOrders = washOrderService.lambdaQuery()
|
|
|
.eq(WashOrder::getStationId, stationId)
|
|
.eq(WashOrder::getStationId, stationId)
|
|
|
.list();
|
|
.list();
|
|
|
- var totalIncome = allOrders.stream().filter(o -> o.getAmountReceived() != null).mapToInt(WashOrder::getAmountReceived).sum();
|
|
|
|
|
|
|
+ var totalIncome = splitRecordService.lambdaQuery()
|
|
|
|
|
+ .eq(SplitRecord::getToStationId, stationId)
|
|
|
|
|
+ .in(SplitRecord::getType, SplitRecord.TYPE_RECHARGE, SplitRecord.TYPE_CROSS_INCOME)
|
|
|
|
|
+ .list().stream().mapToInt(SplitRecord::getAmount).sum();
|
|
|
var totalConsumptionAmount = allOrders.stream().filter(o -> o.getAmount() != null).mapToInt(WashOrder::getAmount).sum();
|
|
var totalConsumptionAmount = allOrders.stream().filter(o -> o.getAmount() != null).mapToInt(WashOrder::getAmount).sum();
|
|
|
- var totalMembers = (int) userService.count();
|
|
|
|
|
|
|
+ var totalMembers = (int) userService.lambdaQuery().eq(User::getStationId, stationId).count();
|
|
|
|
|
|
|
|
DashboardVo dashboardVo = new DashboardVo();
|
|
DashboardVo dashboardVo = new DashboardVo();
|
|
|
dashboardVo.setTodayIncome(todayIncome);
|
|
dashboardVo.setTodayIncome(todayIncome);
|
|
|
- dashboardVo.setTodayConsumptionAmount(todayOrders.stream().filter(o -> o.getAmount() != null).mapToInt(WashOrder::getAmount).sum());
|
|
|
|
|
|
|
+ dashboardVo.setTodayConsumptionAmount(todayConsumptionAmount);
|
|
|
dashboardVo.setTodayWashOrders(todayOrders.size());
|
|
dashboardVo.setTodayWashOrders(todayOrders.size());
|
|
|
dashboardVo.setTodayRegisteredMembers(CommUtil.isEmptyOrNull(todayRegistrations) ? 0 : todayRegistrations.getOrDefault(stationId, 0));
|
|
dashboardVo.setTodayRegisteredMembers(CommUtil.isEmptyOrNull(todayRegistrations) ? 0 : todayRegistrations.getOrDefault(stationId, 0));
|
|
|
|
|
|