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
|
import kotlin.math.round
|
|
/**
|
* 用电量日分析
|
* 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)
|
// 数据对应状态
|
val device = deviceMap[it.mvStatCode]
|
val status = getStatus(it, device)
|
|
// 2.1 根据数据切换当前设备类型
|
if (!dailyInfoMap.containsKey(day)) dailyInfoMap[day] = ElectricDailyInfo()
|
val dayResult = dailyInfoMap[day]!!
|
dayResult.day = day
|
dayResult.changeType(device)
|
// 2.2 每日获取的首个数据,即为当日该设备开启时间
|
if (dayList.size == 1) dayResult.setStartTime(it.mvDataTime)
|
// 2.3 每日获取的首个为运行状态的数据,即为当日该设备正式运行开始时间
|
dayResult.setRunningTime(status, it)
|
// 2.4 每个数据为分钟均值,总数代表开启时长
|
dayResult.addRunTime(status)
|
// 2.5 统计当日设备运行时段(小时)
|
val hour = LocalDateTime.ofInstant(it.mvDataTime.toInstant(), ZoneId.systemDefault()).hour
|
dayResult.addRunPeriod(hour)
|
}
|
// 2.6 统计各台设备每日结束时间及分析结果
|
dataMap.forEach { (dCode, dayMap) ->
|
dayMap.forEach { (day, list) ->
|
dailyInfoMap[day]?.apply {
|
changeType(deviceMap[dCode])
|
setEndTime(list.last().mvDataTime)
|
getResult()
|
}
|
}
|
}
|
dailyInfoMap.forEach { (_,v)-> result += v }
|
|
return result
|
}
|
|
/**
|
* 获取设备当前运行状态
|
* @param e 设备用电量监测数据
|
* @param d 企业设备信息
|
* @return 数据对应结果信息:<状态编号,状态描述,电流均值>
|
*/
|
fun getStatus(e: ElectricMinuteValue?, d: CompanyDevice?): Triple<String, String, Double> {
|
var values = mutableListOf<Int>().apply {
|
d?.cdLimits?.split(";")?.forEach {
|
it.toIntOrNull()?.let { i -> add(i) }
|
}
|
}
|
var status = d?.cdStatus?.split(";") ?: emptyList()
|
var statusNames = d?.cdStatusName?.split(";") ?: emptyList()
|
if (values.isEmpty()) values = mutableListOf(1, 100)
|
if (status.isEmpty()) status = listOf("0", "2", "3")
|
if (statusNames.isEmpty()) statusNames = listOf("待机", "运行", "超负荷")
|
if (e == null) {
|
return Triple(status.first(), statusNames.first(), .0)
|
}
|
|
val electricityList = mutableListOf<Double>()
|
electricityList.add(e.mvElectricityA)
|
electricityList.add(e.mvElectricityB)
|
electricityList.add(e.mvElectricityC)
|
|
val avg = round(electricityList.average() * 100) / 100
|
for (i in values.indices) {
|
if (avg < values[i]) {
|
return Triple(status[i], statusNames[i], avg)
|
}
|
}
|
return Triple(status.last(), statusNames.last(), avg)
|
}
|
}
|