riku
2021-12-01 d9a6f3c2503795f074ac602c24467f804417ad76
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
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
    }
}