Просмотр исходного кода

feat:燃气管网-基础数据管理

null 1 месяц назад
Родитель
Сommit
b82f66d25c

+ 53 - 4
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/hidden/HazardController.java

@@ -81,15 +81,64 @@ public class HazardController {
     @GetMapping("/statistics/type")
     @ApiOperation("按隐患类型统计")
     @Anonymous
-    public AjaxResult statisticsByType() {
-        return AjaxResult.success(service.statisticsByType());
+    public AjaxResult statisticsByType(
+            @RequestParam(required = false) String startDate,
+            @RequestParam(required = false) String endDate) {
+        return AjaxResult.success(service.statisticsByType(startDate, endDate));
     }
 
     @GetMapping("/statistics/status")
     @ApiOperation("按整改状态统计")
     @Anonymous
-    public AjaxResult statisticsByStatus() {
-        return AjaxResult.success(service.statisticsByStatus());
+    public AjaxResult statisticsByStatus(
+            @RequestParam(required = false) String startDate,
+            @RequestParam(required = false) String endDate) {
+        return AjaxResult.success(service.statisticsByStatus(startDate, endDate));
+    }
+
+    @GetMapping("/statistics/overview")
+    @ApiOperation("隐患统计概览(总数、已整改、按等级分布)")
+    @Anonymous
+    public AjaxResult statisticsOverview(
+            @RequestParam(required = false) String startDate,
+            @RequestParam(required = false) String endDate) {
+        return AjaxResult.success(service.statisticsOverview(startDate, endDate));
+    }
+
+    @GetMapping("/statistics/level")
+    @ApiOperation("按隐患等级统计")
+    @Anonymous
+    public AjaxResult statisticsByLevel(
+            @RequestParam(required = false) String startDate,
+            @RequestParam(required = false) String endDate) {
+        return AjaxResult.success(service.statisticsByLevel(startDate, endDate));
+    }
+
+    @GetMapping("/statistics/region")
+    @ApiOperation("按上报单位(区域)统计")
+    @Anonymous
+    public AjaxResult statisticsByRegion(
+            @RequestParam(required = false) String startDate,
+            @RequestParam(required = false) String endDate) {
+        return AjaxResult.success(service.statisticsByRegion(startDate, endDate));
+    }
+
+    @GetMapping("/statistics/type-timeline")
+    @ApiOperation("隐患类型时间线统计(按天汇总,每条类型一条折线)")
+    @Anonymous
+    public AjaxResult statisticsTypeTimeline(
+            @RequestParam(required = false) String startDate,
+            @RequestParam(required = false) String endDate) {
+        return AjaxResult.success(service.statisticsTypeTimeline(startDate, endDate));
+    }
+
+    @GetMapping("/statistics/status-timeline")
+    @ApiOperation("整改状态时间线统计(按天汇总,每个状态一组柱)")
+    @Anonymous
+    public AjaxResult statisticsStatusTimeline(
+            @RequestParam(required = false) String startDate,
+            @RequestParam(required = false) String endDate) {
+        return AjaxResult.success(service.statisticsStatusTimeline(startDate, endDate));
     }
 
     @GetMapping("/export")

+ 20 - 2
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/HazardHiddenAccountService.java

@@ -16,7 +16,25 @@ public interface HazardHiddenAccountService extends IService<HazardHiddenAccount
 
     List<HazardHiddenAccount> getActiveMapPoints();
 
-    List<Map<String, Object>> statisticsByType();
+    List<Map<String, Object>> statisticsByType(String startDate, String endDate);
 
-    List<Map<String, Object>> statisticsByStatus();
+    List<Map<String, Object>> statisticsByStatus(String startDate, String endDate);
+
+    Map<String, Object> statisticsOverview(String startDate, String endDate);
+
+    List<Map<String, Object>> statisticsByLevel(String startDate, String endDate);
+
+    List<Map<String, Object>> statisticsByRegion(String startDate, String endDate);
+
+    /**
+     * 隐患类型时间线统计(按天汇总,每条类型一条折线)
+     * 返回: { categories: [日期...], series: [{ name: 类型, data: [数量...] }] }
+     */
+    Map<String, Object> statisticsTypeTimeline(String startDate, String endDate);
+
+    /**
+     * 整改状态时间线统计(按天汇总,每个状态一组柱)
+     * 返回: { categories: [日期...], series: [{ name: 状态, data: [数量...] }] }
+     */
+    Map<String, Object> statisticsStatusTimeline(String startDate, String endDate);
 }

+ 190 - 4
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/HazardHiddenAccountServiceImpl.java

@@ -10,8 +10,13 @@ import com.zksy.base.service.HazardHiddenAccountService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import com.zksy.common.utils.StringUtils;
+import com.zksy.system.service.ISysDictDataService;
+import org.springframework.beans.factory.annotation.Autowired;
 
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -23,6 +28,9 @@ import java.util.stream.Collectors;
 public class HazardHiddenAccountServiceImpl extends ServiceImpl<HazardHiddenAccountMapper, HazardHiddenAccount>
         implements HazardHiddenAccountService {
 
+    @Autowired
+    private ISysDictDataService dictDataService;
+
     @Override
     public Page<HazardHiddenAccount> findByPage(HazardPageInDTO dto) {
         Page<HazardHiddenAccount> page = new Page<>(dto.getPageNum(), dto.getPageSize());
@@ -62,8 +70,8 @@ public class HazardHiddenAccountServiceImpl extends ServiceImpl<HazardHiddenAcco
     }
 
     @Override
-    public List<Map<String, Object>> statisticsByType() {
-        List<HazardHiddenAccount> list = this.list();
+    public List<Map<String, Object>> statisticsByType(String startDate, String endDate) {
+        List<HazardHiddenAccount> list = this.list(buildDateWrapper(startDate, endDate));
         Map<String, Long> grouped = list.stream()
                 .collect(Collectors.groupingBy(h -> h.getHazardType() != null ? h.getHazardType() : "未知", Collectors.counting()));
         List<Map<String, Object>> result = new ArrayList<>();
@@ -77,8 +85,8 @@ public class HazardHiddenAccountServiceImpl extends ServiceImpl<HazardHiddenAcco
     }
 
     @Override
-    public List<Map<String, Object>> statisticsByStatus() {
-        List<HazardHiddenAccount> list = this.list();
+    public List<Map<String, Object>> statisticsByStatus(String startDate, String endDate) {
+        List<HazardHiddenAccount> list = this.list(buildDateWrapper(startDate, endDate));
         Map<String, Long> grouped = list.stream()
                 .collect(Collectors.groupingBy(h -> h.getHazardStatus() != null ? h.getHazardStatus() : "未知", Collectors.counting()));
         List<Map<String, Object>> result = new ArrayList<>();
@@ -90,4 +98,182 @@ public class HazardHiddenAccountServiceImpl extends ServiceImpl<HazardHiddenAcco
         }
         return result;
     }
+
+    @Override
+    public Map<String, Object> statisticsOverview(String startDate, String endDate) {
+        List<HazardHiddenAccount> list = this.list(buildDateWrapper(startDate, endDate));
+        long total = list.size();
+        long rectified = list.stream()
+                .filter(h -> "3".equals(h.getHazardStatus()))
+                .count();
+
+        // 按隐患等级分组
+        Map<String, Long> levelGrouped = list.stream()
+                .collect(Collectors.groupingBy(h -> h.getHazardLevel() != null ? h.getHazardLevel() : "未知", Collectors.counting()));
+        List<Map<String, Object>> byLevel = new ArrayList<>();
+        for (Map.Entry<String, Long> entry : levelGrouped.entrySet()) {
+            Map<String, Object> item = new HashMap<>();
+            item.put("level", entry.getKey());
+            item.put("count", entry.getValue());
+            byLevel.add(item);
+        }
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("total", total);
+        result.put("rectified", rectified);
+        result.put("byLevel", byLevel);
+        return result;
+    }
+
+    @Override
+    public List<Map<String, Object>> statisticsByLevel(String startDate, String endDate) {
+        List<HazardHiddenAccount> list = this.list(buildDateWrapper(startDate, endDate));
+        Map<String, Long> grouped = list.stream()
+                .collect(Collectors.groupingBy(h -> h.getHazardLevel() != null ? h.getHazardLevel() : "未知", Collectors.counting()));
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (Map.Entry<String, Long> entry : grouped.entrySet()) {
+            Map<String, Object> item = new HashMap<>();
+            item.put("name", entry.getKey());
+            item.put("value", entry.getValue());
+            result.add(item);
+        }
+        return result;
+    }
+
+    @Override
+    public List<Map<String, Object>> statisticsByRegion(String startDate, String endDate) {
+        // 无日期参数时默认最近7天
+        if (!StringUtils.hasText(startDate)) {
+            startDate = LocalDate.now().minusDays(6).toString();
+        }
+        if (!StringUtils.hasText(endDate)) {
+            endDate = LocalDate.now().toString();
+        }
+        List<HazardHiddenAccount> list = this.list(buildDateWrapper(startDate, endDate));
+        Map<String, Long> grouped = list.stream()
+                .collect(Collectors.groupingBy(h -> h.getReportUnit() != null && !h.getReportUnit().isEmpty()
+                        ? h.getReportUnit() : "未知区域", Collectors.counting()));
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (Map.Entry<String, Long> entry : grouped.entrySet()) {
+            Map<String, Object> item = new HashMap<>();
+            item.put("name", entry.getKey());
+            item.put("value", entry.getValue());
+            result.add(item);
+        }
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> statisticsTypeTimeline(String startDate, String endDate) {
+        // 无日期参数时默认最近7天
+        LocalDate rangeStart, rangeEnd;
+        if (StringUtils.hasText(startDate) && StringUtils.hasText(endDate)) {
+            rangeStart = LocalDate.parse(startDate);
+            rangeEnd = LocalDate.parse(endDate);
+        } else {
+            rangeEnd = LocalDate.now();
+            rangeStart = rangeEnd.minusDays(6);
+            startDate = rangeStart.toString();
+            endDate = rangeEnd.toString();
+        }
+        return buildTimeline(startDate, endDate, rangeStart, rangeEnd,
+                HazardHiddenAccount::getHazardType, "hazard_type");
+    }
+
+    @Override
+    public Map<String, Object> statisticsStatusTimeline(String startDate, String endDate) {
+        // 无日期参数时默认最近7天
+        LocalDate rangeStart, rangeEnd;
+        if (StringUtils.hasText(startDate) && StringUtils.hasText(endDate)) {
+            rangeStart = LocalDate.parse(startDate);
+            rangeEnd = LocalDate.parse(endDate);
+        } else {
+            rangeEnd = LocalDate.now();
+            rangeStart = rangeEnd.minusDays(6);
+            startDate = rangeStart.toString();
+            endDate = rangeEnd.toString();
+        }
+        return buildTimeline(startDate, endDate, rangeStart, rangeEnd,
+                HazardHiddenAccount::getHazardStatus, "hazard_status");
+    }
+
+    /**
+     * 通用时间线构建:按 reportTime 天 + 指定字段分组
+     *
+     * @param startDate  查询起始日期字符串
+     * @param endDate    查询结束日期字符串
+     * @param rangeStart 日期轴起点
+     * @param rangeEnd   日期轴终点
+     * @param classifier 分组字段 (hazardType / hazardStatus)
+     * @param dictType   字典类型,用于将字典值转为标签 (hazard_type / hazard_status)
+     * @return { categories: [...], series: [{name: 中文标签, data}, ...] }
+     */
+    private Map<String, Object> buildTimeline(String startDate, String endDate,
+                                              LocalDate rangeStart, LocalDate rangeEnd,
+                                              java.util.function.Function<HazardHiddenAccount, String> classifier,
+                                              String dictType) {
+        List<HazardHiddenAccount> list = this.list(buildDateWrapper(startDate, endDate));
+        List<String> categories = generateDateRange(rangeStart, rangeEnd);
+
+        // 二级分组: 字段值 → 日期 → 数量
+        Map<String, Map<LocalDate, Long>> fieldDateMap = list.stream()
+                .collect(Collectors.groupingBy(
+                        h -> {
+                            String val = classifier.apply(h);
+                            return val != null && !val.isEmpty() ? val : "未知";
+                        },
+                        Collectors.groupingBy(
+                                h -> h.getReportTime() != null ? h.getReportTime().toLocalDate() : LocalDate.now(),
+                                Collectors.counting()
+                        )
+                ));
+
+        List<Map<String, Object>> series = new ArrayList<>();
+        for (Map.Entry<String, Map<LocalDate, Long>> entry : fieldDateMap.entrySet()) {
+            Map<String, Object> s = new HashMap<>();
+            // 通过字典服务将字典值转为中文标签
+            String label = dictDataService.selectDictLabel(dictType, entry.getKey());
+            s.put("name", StringUtils.hasText(label) ? label : entry.getKey());
+            Map<LocalDate, Long> dateCount = entry.getValue();
+            List<Long> data = new ArrayList<>();
+            for (String dateStr : categories) {
+                LocalDate d = LocalDate.parse(dateStr);
+                data.add(dateCount.getOrDefault(d, 0L));
+            }
+            s.put("data", data);
+            series.add(s);
+        }
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("categories", categories);
+        result.put("series", series);
+        return result;
+    }
+
+    /**
+     * 生成日期序列(包含首尾)
+     */
+    private List<String> generateDateRange(LocalDate start, LocalDate end) {
+        List<String> dates = new ArrayList<>();
+        LocalDate current = start;
+        while (!current.isAfter(end)) {
+            dates.add(current.toString());
+            current = current.plusDays(1);
+        }
+        return dates;
+    }
+
+    /**
+     * 根据日期范围构建查询条件,使用 reportTime 字段过滤
+     */
+    private LambdaQueryWrapper<HazardHiddenAccount> buildDateWrapper(String startDate, String endDate) {
+        LambdaQueryWrapper<HazardHiddenAccount> wrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.hasText(startDate)) {
+            wrapper.ge(HazardHiddenAccount::getReportTime, LocalDate.parse(startDate).atStartOfDay());
+        }
+        if (StringUtils.hasText(endDate)) {
+            wrapper.le(HazardHiddenAccount::getReportTime, LocalDate.parse(endDate).atTime(LocalTime.MAX));
+        }
+        return wrapper;
+    }
 }