package com.flightfeather.uav.dataprocess
|
|
import com.flightfeather.uav.common.utils.DateUtil
|
import com.flightfeather.uav.domain.entity.CompanyDevice
|
import com.flightfeather.uav.domain.entity.ElectricMinuteValue
|
import com.flightfeather.uav.lightshare.bean.ElectricDailyInfo
|
import java.time.LocalDateTime
|
import java.time.ZoneId
|
|
/**
|
* 用电量日分析
|
* Date 2021/12/1 14:53
|
* Created by feiyu
|
*/
|
object ElectricDailyAnalysis {
|
|
fun analysis(deviceList: List<CompanyDevice>, dataList: List<ElectricMinuteValue>): List<ElectricDailyInfo> {
|
// 返回结果
|
val result = mutableListOf<ElectricDailyInfo>()
|
// 每日统计信息
|
val dailyInfoMap = mutableMapOf<String, ElectricDailyInfo>()
|
|
// 1.数据准备
|
val deviceMap = mutableMapOf<String, CompanyDevice>()
|
val dataMap = mutableMapOf<String, MutableMap<String, MutableList<ElectricMinuteValue>>>()
|
deviceList.forEach {
|
// 监测数据
|
if (!dataMap.containsKey(it.cdDeviceCode)) {
|
dataMap[it.cdDeviceCode] = mutableMapOf()
|
}
|
// 设备信息
|
deviceMap[it.cdDeviceCode] = it
|
}
|
// 2.轮询数据,统计每日的各项特征
|
dataList.forEach {
|
// 获取日期
|
val day = DateUtil.instance.dateToString(it.mvDataTime, DateUtil.DateStyle.YYYY_MM_DD) ?: ""
|
// 每日对应一组数据
|
if (dataMap[it.mvStatCode]?.containsKey(day) != true) dataMap[it.mvStatCode]?.put(day, mutableListOf())
|
val dayList = dataMap[it.mvStatCode]?.get(day)!!
|
dayList.add(it)
|
|
// 2.1 根据数据切换当前设备类型
|
if (!dailyInfoMap.containsKey(day)) dailyInfoMap[day] = ElectricDailyInfo()
|
val dayResult = dailyInfoMap[day]!!
|
dayResult.day = day
|
dayResult.changeType(deviceMap[it.mvStatCode])
|
// 2.2 每日获取的首个数据,即为当日该设备开启时间
|
if (dayList.size == 1) dayResult.setStartTime(it.mvDataTime)
|
// 2.3 每个数据为分钟均值,总数代表开启时长
|
dayResult.addRunTime(1)
|
// 2.4 统计当日设备运行时段(小时)
|
val hour = LocalDateTime.ofInstant(it.mvDataTime.toInstant(), ZoneId.systemDefault()).hour
|
dayResult.addRunPeriod(hour)
|
}
|
// 2.5 统计各台设备每日结束时间及分析结果
|
dataMap.forEach { (dCode, dayMap) ->
|
dayMap.forEach { (day, list) ->
|
dailyInfoMap[day]?.apply {
|
changeType(deviceMap[dCode])
|
setEndTime(list.last().mvDataTime)
|
}
|
}
|
}
|
dailyInfoMap.forEach { (_,v)-> result += v }
|
|
return result
|
}
|
}
|