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
|
}
|
}
|