feiyu02
2025-09-30 6904763f0e74d9a9fa4dbc39f635d2aee39416c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package cn.flightfeather.supervision.bgtask.maintenance
 
import cn.flightfeather.supervision.bgtask.TaskJinAnHourlyDustData
import cn.flightfeather.supervision.common.net.JinAnLianTongHttpService
import cn.flightfeather.supervision.domain.mapper.HourDustDataMapper
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Component
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.*
 
/**
 * 获取静安工地监测点小时数据数据补充维护任务
 * @date 2024/6/3
 * @author feiyu02
 */
@Component
class MTJinAnHourlyDustData(
    private val hourDustDataMapper: HourDustDataMapper,
    private val taskJinAnHourlyDustData: TaskJinAnHourlyDustData
) {
    private val logger = LoggerFactory.getLogger(MTJinAnHourlyDustData::class.java)
 
    /**
     * 默认执行前一周时段内的数据补充任务
     */
    fun handle() {
        val end = LocalDate.now().atStartOfDay()
        val start = end.withDayOfMonth(1)
        handle(start, end)
    }
 
    fun handle(year: Int, month: Int) {
        val start = LocalDate.of(year, month, 1).atStartOfDay()
        val end = start.plusMonths(1).minusSeconds(1)
        handle(start, end)
    }
 
    fun handle(start:LocalDateTime, end:LocalDateTime) {
        logger.info("=========<静安工地监测点小时数据数据补充维护任务开启>=========")
        // 筛选缺失的时间(以天为最小单位)
        val timeList = findLostTime(start, end)
        logger.info("==>共有${timeList.size}天数据不完整")
        // 获取缺失数据
        timeList.forEach {
            logger.info("==>开始获取${it.format(DateTimeFormatter.ofPattern("YYYY-MM-dd"))}的监测数据")
            val sT = Date.from(it.atZone(ZoneId.systemDefault()).toInstant())
            val eT = Date.from(it.plusDays(1).atZone(ZoneId.systemDefault()).toInstant())
            var page = 1
            var hasNextPage: Boolean = false
            var count = 0
            do {
                try {
                    val res = JinAnLianTongHttpService.getHourlyDustData(page, sT, eT)
                    hasNextPage = res.first
                    page++
                    count += res.second.size
                    taskJinAnHourlyDustData.saveSiteInfo(res.second)
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            } while (hasNextPage)
            logger.info("==>${it.format(DateTimeFormatter.ofPattern("YYYY-MM-dd"))}监测数据获取,数据量${count}")
        }
    }
 
    /**
     * 筛选缺失的时间(结果以天为最小单位)
     */
    fun findLostTime(sT:LocalDateTime, eT:LocalDateTime): List<LocalDateTime> {
        // 获取已有数据的监测点每日数据量
        val countList = hourDustDataMapper.findDataCountEachDay(sT, eT)
        val countMap = mutableMapOf<String?, MutableMap<String?, Int?>>()
        countList.forEach {
            if (!countMap.containsKey(it.name)) {
                countMap[it.name] = mutableMapOf()
            }
            countMap[it.name]!![it.category] = it.count
        }
        // 统计数据不完整的日期
        val resList = mutableListOf<LocalDateTime>()
        var t = sT
        while (t.isBefore(eT)) {
            val timeTag = t.format(DateTimeFormatter.ofPattern("YYYY-MM-dd"))
            for ((k, v) in countMap) {
                // 至少有一个监测点当天没有数据或者数据数量不完整,则需要补全当天数据
                if (v[timeTag] == null || v[timeTag]!! < 24) {
                    resList.add(t)
                    break
                }
            }
            t = t.plusDays(1)
        }
 
        return resList
    }
}