feiyu02
2021-11-22 d04e699fcd11aa715439d8ab87827a3984450ccd
1. 用电量数据平滑处理缺失的分钟值
已修改2个文件
135 ■■■■ 文件已修改
src/main/kotlin/com/flightfeather/uav/lightshare/bean/ElectricVo.kt 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt 129 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/bean/ElectricVo.kt
@@ -6,12 +6,14 @@
    var d1eA: Double = .0,
    var d1eB: Double = .0,
    var d1eC: Double = .0,
    var d1Avg: Double = .0,
    var d1Status: String? = "0",
    var d1StatusName: String? = null,
    var d1StatusName: String? = "待机",
    //废气净化装置
    var d2eA: Double = .0,
    var d2eB: Double = .0,
    var d2eC: Double = .0,
    var d2Avg: Double = .0,
    var d2Status: String? = "0",
    var d2StatusName: String? = null
    var d2StatusName: String? = "待机"
)
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt
@@ -20,6 +20,7 @@
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import kotlin.math.round
@Service
class ElectricityServiceImpl(
@@ -178,53 +179,105 @@
            null
        }
        var lsT = LocalDateTime.ofInstant(sT?.toInstant(), ZoneId.systemDefault()).withSecond(0)
        val leT = LocalDateTime.ofInstant(eT?.toInstant(), ZoneId.systemDefault()).withSecond(0)
        if (sT == null || eT == null) {
            return BaseResponse(true, data = result)
        }
        if (sT != null && eT != null) {
            while (!lsT.isAfter(leT)) {
                val vo = ElectricVo(lsT.format(dateFormatter2))
                if (dataList1.isNotEmpty()) {
                    val d = dataList1[0]
                    val t = LocalDateTime.ofInstant(d?.mvDataTime?.toInstant(), ZoneId.systemDefault()).withSecond(0)
                    if (lsT.isEqual(t)) {
        var lsT = LocalDateTime.ofInstant(sT.toInstant(), ZoneId.systemDefault()).withSecond(0)
        val leT = LocalDateTime.ofInstant(eT.toInstant(), ZoneId.systemDefault()).withSecond(0)
        // 根据两台设备的最长起始时间,计算其中每一分钟的对应均值
        while (!lsT.isAfter(leT)) {
            // 两台设备的数据根据时间合并为一个结构体
            val vo = ElectricVo(lsT.format(dateFormatter2))
            // FIXME: 2021/11/22 此处由于前端设备的采样时间不标准 ,采样周期并不是严格的1分钟,导致采样时间有时会缺少1分钟的数据
            // FIXME: 2021/11/22 因此,当某一分钟该设备数据轮空时,采用前一个数据作为填充
            if (dataList1.isNotEmpty()) {
                val d = dataList1[0]
                val t = LocalDateTime.ofInstant(d?.mvDataTime?.toInstant(), ZoneId.systemDefault()).withSecond(0)
                if (lsT.isEqual(t)) {
                    vo.apply {
                        d1eA = d?.mvElectricityA ?: .0
                        d1eB = d?.mvElectricityB ?: .0
                        d1eC = d?.mvElectricityC ?: .0
                        val s = getStatus(d, d1)
                        d1Status = s.first
                        d1StatusName = s.second
                        d1Avg = s.third
                    }
                    dataList1.removeAt(0)
                } else {
                    result.lastOrNull()?.let {
                        vo.apply {
                            d1eA = d?.mvElectricityA ?: .0
                            d1eB = d?.mvElectricityB ?: .0
                            d1eC = d?.mvElectricityC ?: .0
                            val s = getStatus(d, d1)
                            d1Status = s.first
                            d1StatusName = s.second
                            d1eA = it.d1eA
                            d1eB = it.d1eB
                            d1eC = it.d1eC
                            d1Status = it.d1Status
                            d1StatusName = it.d1StatusName
                            d1Avg = it.d1Avg
                        }
                        dataList1.removeAt(0)
                    }
                }
                if (dataList2.isNotEmpty()) {
                    val d = dataList2[0]
                    val t = LocalDateTime.ofInstant(d?.mvDataTime?.toInstant(), ZoneId.systemDefault()).withSecond(0)
                    if (lsT.isEqual(t)) {
                        vo.apply {
                            d2eA = d?.mvElectricityA ?: .0
                            d2eB = d?.mvElectricityB ?: .0
                            d2eC = d?.mvElectricityC ?: .0
                            val s = getStatus(d, d2)
                            d2Status = s.first
                            d2StatusName = s.second
                        }
                        dataList2.removeAt(0)
            } else {
                result.lastOrNull()?.let {
                    vo.apply {
                        d1eA = it.d1eA
                        d1eB = it.d1eB
                        d1eC = it.d1eC
                        d1Status = it.d1Status
                        d1StatusName = it.d1StatusName
                        d1Avg = it.d1Avg
                    }
                }
                result.add(vo)
                lsT = lsT.plusMinutes(1)
            }
            if (dataList2.isNotEmpty()) {
                val d = dataList2[0]
                val t = LocalDateTime.ofInstant(d?.mvDataTime?.toInstant(), ZoneId.systemDefault()).withSecond(0)
                if (lsT.isEqual(t)) {
                    vo.apply {
                        d2eA = d?.mvElectricityA ?: .0
                        d2eB = d?.mvElectricityB ?: .0
                        d2eC = d?.mvElectricityC ?: .0
                        val s = getStatus(d, d2)
                        d2Status = s.first
                        d2StatusName = s.second
                        d2Avg = s.third
                    }
                    dataList2.removeAt(0)
                } else {
                    result.lastOrNull()?.let {
                        vo.apply {
                            d2eA = it.d2eA
                            d2eB = it.d2eB
                            d2eC = it.d2eC
                            d2Status = it.d2Status
                            d2StatusName = it.d2StatusName
                            d2Avg = it.d2Avg
                        }
                    }
                }
            } else {
                result.lastOrNull()?.let {
                    vo.apply {
                        d2eA = it.d2eA
                        d2eB = it.d2eB
                        d2eC = it.d2eC
                        d2Status = it.d2Status
                        d2StatusName = it.d2StatusName
                        d2Avg = it.d2Avg
                    }
                }
            }
            result.add(vo)
            lsT = lsT.plusMinutes(1)
        }
        return BaseResponse(true, head = DataHead(pageInfo.pageNum, pageInfo.pages), data = result)
    }
    // FIXME: 2021/11/5 此处暂时写死,后续修改
    private fun getStatus(e: ElectricMinuteValue?, d: CompanyDevice?): Pair<String, String> {
    private 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) }
@@ -236,7 +289,7 @@
        if (status.isEmpty()) status = listOf("0", "2", "3")
        if (statusNames.isEmpty()) statusNames = listOf("待机", "运行", "超负荷")
        if (e == null) {
            return Pair(status.first(), statusNames.first())
            return Triple(status.first(), statusNames.first(), .0)
        }
        val electricityList = mutableListOf<Double>()
@@ -244,12 +297,12 @@
        electricityList.add(e.mvElectricityB)
        electricityList.add(e.mvElectricityC)
        val avg = electricityList.average()
        val avg = round(electricityList.average() * 100) / 100
        for (i in values.indices) {
            if (avg < values[i]) {
                return Pair(status[i], statusNames[i])
                return Triple(status[i], statusNames[i], avg)
            }
        }
        return Pair(status.last(), statusNames.last())
        return Triple(status.last(), statusNames.last(), avg)
    }
}