ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -2228,7 +2228,62 @@
      pageInfo.setRecords(list);
      return R.ok(pageInfo);
   }
      @Override
   public R<PageInfo<EnterpriseChargingAnalysisVO>> enterpriseChargingAnalysis(EnterpriseChargingAnalysisQuery query) {
      PageInfo<EnterpriseChargingAnalysisVO> pageInfo = new PageInfo<>(query.getPageCurr(), query.getPageSize());
      List<EnterpriseChargingAnalysisVO> list = this.baseMapper.enterpriseChargingAnalysis(pageInfo, query);
      for (EnterpriseChargingAnalysisVO row : list) {
         EnterpriseChargingAnalysisQuery rowQuery = buildEnterpriseRowQuery(query, row);
         List<Map<String, Object>> topSites = this.baseMapper.enterpriseTopSites(rowQuery);
         String topSiteNames = topSites.stream()
               .map(item -> Objects.toString(item.get("siteName"), ""))
               .filter(org.springframework.util.StringUtils::hasText)
               .collect(Collectors.joining("、"));
         row.setTopSiteNames(topSiteNames);
         row.setAverageChargingInterval(calculateAverageChargingInterval(this.baseMapper.enterpriseChargingTimes(rowQuery)));
      }
      pageInfo.setRecords(list);
      return R.ok(pageInfo);
   }
   @Override
   public R<PageInfo<EnterpriseChargingDetailVO>> enterpriseChargingDetail(EnterpriseChargingAnalysisQuery query) {
      PageInfo<EnterpriseChargingDetailVO> pageInfo = new PageInfo<>(query.getPageCurr(), query.getPageSize());
      List<EnterpriseChargingDetailVO> list = this.baseMapper.enterpriseChargingDetail(pageInfo, query);
      pageInfo.setRecords(list);
      return R.ok(pageInfo);
   }
   @Override
   public List<EnterpriseChargingDetailVO> enterpriseChargingDetailExport(EnterpriseChargingAnalysisQuery query) {
      return this.baseMapper.enterpriseChargingDetailExport(query);
   }
   private EnterpriseChargingAnalysisQuery buildEnterpriseRowQuery(EnterpriseChargingAnalysisQuery source, EnterpriseChargingAnalysisVO row) {
      EnterpriseChargingAnalysisQuery rowQuery = new EnterpriseChargingAnalysisQuery();
      BeanUtils.copyProperties(source, rowQuery);
      rowQuery.setCompanyName(null);
      rowQuery.setExactCompanyName(row.getCompanyName());
      rowQuery.setSocialCreditCode(row.getSocialCreditCode());
      return rowQuery;
   }
   private BigDecimal calculateAverageChargingInterval(List<LocalDateTime> times) {
      if (times == null || times.size() < 2) {
         return BigDecimal.ZERO;
      }
      long totalMinutes = 0L;
      for (int i = 1; i < times.size(); i++) {
         long minutes = ChronoUnit.MINUTES.between(times.get(i - 1), times.get(i));
         if (minutes > 0) {
            totalMinutes += minutes;
         }
      }
      return BigDecimal.valueOf(totalMinutes)
            .divide(BigDecimal.valueOf(times.size() - 1L), 4, RoundingMode.HALF_UP)
            .divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_UP);
   }
   @Override
   public R<PageInfo<TChargingOrderRefund>> getRefundList(ChargingRefundDto chargingRefundDto) {
      PageInfo<TChargingOrderRefund> pageInfo = new PageInfo<>(chargingRefundDto.getPageCurr(), chargingRefundDto.getPageSize());