package com.xiaopeng.maintenance.service.impl; import com.xiaopeng.api.dto.statistics.*; import com.xiaopeng.api.feignClient.account.XpAppUserClient; import com.xiaopeng.api.feignClient.order.XpOrderClient; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.maintenance.dto.IndexDataQuery; import com.xiaopeng.maintenance.mapper.XpFleetMapper; import com.xiaopeng.maintenance.mapper.XpVehicleMapper; import com.xiaopeng.maintenance.service.IndexDataService; import com.xiaopeng.maintenance.vo.IndexDataVO; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; /** * 首页数据统计服务实现 * * @author mitao */ @Slf4j @Service public class IndexDataServiceImpl implements IndexDataService { @Resource private XpVehicleMapper xpVehicleMapper; @Resource private XpFleetMapper xpFleetMapper; @Resource private XpAppUserClient xpAppUserClient; @Resource private XpOrderClient xpOrderClient; private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @Override public IndexDataVO getIndexData(IndexDataQuery query) { IndexDataVO vo = new IndexDataVO(); // 1. 处理默认参数 LocalDate today = LocalDate.now(); LocalDate runningDate = query.getRunningDate() != null ? query.getRunningDate() : today; LocalDate growthStartDate = query.getGrowthStartDate() != null ? query.getGrowthStartDate() : today; LocalDate growthEndDate = query.getGrowthEndDate() != null ? query.getGrowthEndDate() : today; // 2. 构建今日运行情况查询参数 StatisticsQueryDTO todayQuery = new StatisticsQueryDTO(); todayQuery.setStartDate(runningDate); todayQuery.setEndDate(runningDate); todayQuery.setTrendDays(30); // 3. 调用Feign获取今日用户统计数据 UserStatisticsDTO todayUserStats = getUserStatistics(todayQuery); // 4. 调用Feign获取今日订单统计数据 OrderStatisticsDTO todayOrderStats = getOrderStatistics(todayQuery); // 5. 本地查询今日车辆统计数据 Long todayNewVehicles = xpVehicleMapper.countNewVehicles(runningDate, runningDate); // 6. 组装今日运行情况 vo.setNewUserCount(todayUserStats.getNewCount() != null ? todayUserStats.getNewCount() : 0L); vo.setVehicleCount(todayNewVehicles != null ? todayNewVehicles : 0L); vo.setOrderCount(todayOrderStats.getNewCount() != null ? todayOrderStats.getNewCount() : 0L); // 7. 查询运营总数据 StatisticsQueryDTO totalQuery = new StatisticsQueryDTO(); totalQuery.setTrendDays(30); UserStatisticsDTO totalUserStats = getUserStatistics(totalQuery); OrderStatisticsDTO totalOrderStats = getOrderStatistics(totalQuery); Long totalVehicles = xpVehicleMapper.selectCount(null); Long totalFleets = xpFleetMapper.selectCount(null); // 8. 组装运营总数据 vo.setTotalUserCount(totalUserStats.getTotalCount() != null ? totalUserStats.getTotalCount() : 0L); vo.setFleetCount(totalFleets != null ? totalFleets : 0L); vo.setTotalVehicleCount(totalVehicles != null ? totalVehicles : 0L); vo.setTotalOrderCount(totalOrderStats.getTotalCount() != null ? totalOrderStats.getTotalCount() : 0L); // 总交易金额和总收入(pay_money累加) BigDecimal totalMoney = totalOrderStats.getTotalMoney() != null ? totalOrderStats.getTotalMoney() : BigDecimal.ZERO; vo.setTotalMoney(totalMoney.longValue()); vo.setTotalIncome(totalMoney.longValue()); // 9. 查询运营增长数据 StatisticsQueryDTO growthQuery = new StatisticsQueryDTO(); growthQuery.setStartDate(growthStartDate); growthQuery.setEndDate(growthEndDate); growthQuery.setTrendDays(30); UserStatisticsDTO growthUserStats = getUserStatistics(growthQuery); OrderStatisticsDTO growthOrderStats = getOrderStatistics(growthQuery); Long growthVehicles = xpVehicleMapper.countNewVehicles(growthStartDate, growthEndDate); // 10. 组装运营增长数据 vo.setUserGrowthCount(growthUserStats.getNewCount() != null ? growthUserStats.getNewCount() : 0L); vo.setVehicleGrowthCount(growthVehicles != null ? growthVehicles : 0L); vo.setOrderGrowthCount(growthOrderStats.getNewCount() != null ? growthOrderStats.getNewCount() : 0L); // 11. 组装运营总趋势(近30天) LocalDate trendEndDate = LocalDate.now(); LocalDate trendStartDate = trendEndDate.minusDays(29); // 生成日期列表 List dateList = new ArrayList<>(); for (LocalDate date = trendStartDate; !date.isAfter(trendEndDate); date = date.plusDays(1)) { dateList.add(date.format(DATE_FORMATTER)); } // 获取用户趋势数据 StatisticsQueryDTO trendQuery = new StatisticsQueryDTO(); trendQuery.setStartDate(trendStartDate); trendQuery.setEndDate(trendEndDate); trendQuery.setTrendDays(30); UserStatisticsDTO trendUserStats = getUserStatistics(trendQuery); OrderStatisticsDTO trendOrderStats = getOrderStatistics(trendQuery); List userDailyList = trendUserStats.getDailyCountList() != null ? trendUserStats.getDailyCountList() : new ArrayList<>(); List orderDailyList = trendOrderStats.getDailyCountList() != null ? trendOrderStats.getDailyCountList() : new ArrayList<>(); // 转换为Map便于查找 Map userDailyMap = userDailyList.stream() .collect(Collectors.toMap(DailyCountDTO::getDate, DailyCountDTO::getCount, (a, b) -> a)); Map orderDailyMap = orderDailyList.stream() .collect(Collectors.toMap(DailyCountDTO::getDate, DailyCountDTO::getCount, (a, b) -> a)); // 填充趋势数据(确保每天都有数据,没有的填0) List trendUserList = new ArrayList<>(); List trendOrderList = new ArrayList<>(); for (String date : dateList) { trendUserList.add(userDailyMap.getOrDefault(date, 0L)); trendOrderList.add(orderDailyMap.getOrDefault(date, 0L)); } vo.setUserCountList(trendUserList); vo.setOrderCountList(trendOrderList); return vo; } /** * 获取用户统计数据(带降级处理) */ private UserStatisticsDTO getUserStatistics(StatisticsQueryDTO query) { try { R result = xpAppUserClient.getUserStatistics(query); if (result != null && result.getData() != null) { return result.getData(); } } catch (Exception e) { log.error("获取用户统计数据失败: {}", e.getMessage()); } // 返回默认空数据 UserStatisticsDTO dto = new UserStatisticsDTO(); dto.setTotalCount(0L); dto.setNewCount(0L); dto.setDailyCountList(new ArrayList<>()); return dto; } /** * 获取订单统计数据(带降级处理) */ private OrderStatisticsDTO getOrderStatistics(StatisticsQueryDTO query) { try { R result = xpOrderClient.getOrderStatistics(query); if (result != null && result.getData() != null) { return result.getData(); } } catch (Exception e) { log.error("获取订单统计数据失败: {}", e.getMessage()); } // 返回默认空数据 OrderStatisticsDTO dto = new OrderStatisticsDTO(); dto.setTotalCount(0L); dto.setNewCount(0L); dto.setTotalMoney(BigDecimal.ZERO); dto.setTotalIncome(BigDecimal.ZERO); dto.setDailyCountList(new ArrayList<>()); return dto; } }