Explorar el Código

refactor(water-usage-data): 重构年月统计数据查询接口- 在 WaterUsageDataController 中添加 year 参数,用于指定查询的年份
- 在 WaterUsageDataMapper 中实现新的 SQL 查询语句,使用 LEFT JOIN 来包含所有月份的数据
- 更新 WaterUsageDataService接口,将 getYearlyMonthlyStats 方法改为 getYearlyStatistics

林仔 hace 8 meses
padre
commit
ca73d9b413

+ 6 - 2
park-overview-service/src/main/java/com/zksy/park/controller/WaterUsageDataController.java

@@ -23,6 +23,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
@@ -111,8 +112,11 @@ public class WaterUsageDataController {
     }
     @ApiOperation(value = "查询当年月数据")
     @GetMapping("/yearlyMonthlyStats")
-    public Result getYearlyMonthlyStats() {
-        return Result.ok(service.getYearlyMonthlyStats());
+    public Result getYearlyMonthlyStats(@RequestParam(required = false) Integer year) {
+        if (year == null) {
+            year = LocalDate.now().getYear();
+        }
+        return Result.ok(service.getYearlyStatistics(year));
     }
 
     @GetMapping("/exportExcel")

+ 14 - 10
park-overview-service/src/main/java/com/zksy/park/mapper/WaterUsageDataMapper.java

@@ -17,16 +17,20 @@ import java.util.Map;
 */
 @Mapper
 public interface WaterUsageDataMapper extends BaseMapper<WaterUsageData> {
-    @Select("SELECT " +
-            "SUBSTRING(statistical_time, 1, 4) AS year, " + // 提取年份,如从“2025年9月”中提取“2025”
-            "SUBSTRING(statistical_time, 6, LENGTH(statistical_time)-5) AS month, " + // 提取月份,如从“2025年9月”中提取“9”
-            "SUM(water_volume) AS total_water_volume, " +
-            "SUM(amount) AS total_amount " +
-            "FROM water_usage_data " +
-            "WHERE SUBSTRING(statistical_time, 1, 4) = #{year} " + // 按提取的年份筛选
-            "GROUP BY SUBSTRING(statistical_time, 1, 4), SUBSTRING(statistical_time, 6, LENGTH(statistical_time)-5) " +
-            "ORDER BY SUBSTRING(statistical_time, 6, LENGTH(statistical_time)-5)")
-    List<Map<String, Object>> getMonthlyStatsByYear(@Param("year") String year);
+    @Select("SELECT \n" +
+            "        m.month AS month,\n" +
+            "        IFNULL(SUM(w.water_volume), 0) AS totalWaterVolume,\n" +
+            "        IFNULL(SUM(w.amount), 0) AS totalAmount\n" +
+            "    FROM \n" +
+            "        (SELECT 1 AS month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 \n" +
+            "         UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 \n" +
+            "         UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) m\n" +
+            "    LEFT JOIN water_usage_data w \n" +
+            "        ON YEAR(w.create_time) = #{year}\n" +
+            "        AND MONTH(w.create_time) = m.month\n" +
+            "    GROUP BY m.month\n" +
+            "    ORDER BY m.month")
+    List<Map<String, Object>> getYearlyUsageStatistics(@Param("year") int year);
 }
 
 

+ 1 - 1
park-overview-service/src/main/java/com/zksy/park/service/WaterUsageDataService.java

@@ -29,5 +29,5 @@ public interface WaterUsageDataService extends IService<WaterUsageData> {
         // 4. 客户用水趋势
         List<Map<String, Object>> getCustomerTrend(Long customerCode);
 
-        List<MonthlyWaterStats> getYearlyMonthlyStats();
+        List<Map<String, Object>> getYearlyStatistics(int year);
 }

+ 6 - 52
park-overview-service/src/main/java/com/zksy/park/service/impl/WaterUsageDataServiceImpl.java

@@ -1,32 +1,14 @@
 package com.zksy.park.service.impl;
 
-import com.alibaba.excel.EasyExcel;
-import com.alibaba.excel.ExcelWriter;
-import com.alibaba.excel.write.metadata.WriteSheet;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.zksy.common.core.domain.Result;
 import com.zksy.park.domain.WaterUsageData;
-import com.zksy.park.domain.vo.MonthlyWaterStats;
-import com.zksy.park.listener.WaterUsageDataListener;
 import com.zksy.park.service.WaterUsageDataService;
 import com.zksy.park.mapper.WaterUsageDataMapper;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
-import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
 * @author Administrator
@@ -37,6 +19,9 @@ import java.util.stream.Collectors;
 public class WaterUsageDataServiceImpl extends ServiceImpl<WaterUsageDataMapper, WaterUsageData>
         implements WaterUsageDataService {
 
+    @Autowired
+    private WaterUsageDataMapper waterUsageDataMapper;
+
     @Override
     public List<Map<String, Object>> getMonthSummary() {
         return this.listMaps(new QueryWrapper<WaterUsageData>()
@@ -78,39 +63,8 @@ public class WaterUsageDataServiceImpl extends ServiceImpl<WaterUsageDataMapper,
     }
 
     @Override
-    public List<MonthlyWaterStats> getYearlyMonthlyStats() {
-        // 获取当前年份的字符串形式
-        String currentYear = String.valueOf(LocalDate.now().getYear());
-
-        // 从数据库查询当前年份已有的月度数据
-        List<Map<String, Object>> dbStats = baseMapper.getMonthlyStatsByYear(currentYear);
-
-        // 将查询结果转换为Map便于查找,key为月份(如"9")
-        Map<String, Map<String, Object>> statsMap = dbStats.stream()
-                .collect(Collectors.toMap(
-                        item -> item.get("month").toString(),
-                        item -> item
-                ));
-
-        // 构建12个月的完整数据列表
-        List<MonthlyWaterStats> result = new ArrayList<>();
-        for (int i = 1; i <= 12; i++) {
-            // 月份转为字符串
-            String month = String.valueOf(i);
-
-            // 从查询结果中获取当前月份数据,无数据则用0填充
-            Map<String, Object> monthData = statsMap.getOrDefault(month, new HashMap<>());
-            Long waterVolume = monthData.containsKey("total_water_volume")
-                    ? ((Number) monthData.get("total_water_volume")).longValue()
-                    : 0L;
-            BigDecimal amount = monthData.containsKey("total_amount")
-                    ? (BigDecimal) monthData.get("total_amount")
-                    : BigDecimal.ZERO;
-
-            result.add(new MonthlyWaterStats(month, waterVolume, amount));
-        }
-
-        return result;
+    public List<Map<String, Object>> getYearlyStatistics(int year) {
+        return waterUsageDataMapper.getYearlyUsageStatistics(year);
     }
 }