|
|
@@ -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;
|
|
|
+ }
|
|
|
}
|