src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeDataGrid.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,53 @@ package com.flightfeather.uav.dataprocess /** * åå¼è®¡ç®å·¥å ·ï¼å°ä¸ç»è¿ç»æ°æ®è½¬æ¢ä¸ºèªå®ä¹å¨æçå弿°æ® * è¦æ±ä¼ å ¥çæ°æ®æç §æ¶é´é¡ºåºæåï¼ * @param onTag å®ä¹æ°æ®æ ç¾è·ååè°å½æ°ï¼å½å½åæ°æ®æ ç¾ä¸ä¸ä¸ªæ°æ®æ ç¾ä¸åæ¶ï¼å³è®¤ä¸ºä¸ä¸ç»æ°æ®ä¸ºåä¸ç»æ°æ®ï¼éæ±åºåå¼ * @param onAvg å®ä¹åå¼è®¡ç®æ¹æ³ */ class AverageUtil<T : Any>(var onTag: (d: T) -> String, var onAvg: (list: List<T>) -> T) { // ç¼åææ°çtag private var lastTag: String? = null // ä¸´æ¶æ°æ®ç¼å private val dataSet = mutableListOf<T>() // 转æ¢ç»æ private val result = mutableListOf<T>() /** * å°æ°æ®é转æ¢ä¸ºå弿°æ® * @param list åå§æ°æ® * @return å弿°æ® */ fun avg(list: List<T>): List<T> { // åå§åææåé clear() // 计ç®åå¼ list.forEach { val tag = onTag(it) // ç¬¬ä¸æ¡æ°æ®åtagç¸åæ¶ï¼å°æ°æ®æ¾å ¥ä¸´æ¶ç¼åå表 if (lastTag == null || tag == lastTag) { dataSet.add(it) } // å½tagä¸åæ¶ï¼è®¡ç®ä¹åæ°æ®çåå¼ï¼åæ¶æ åµä¸´æ¶æ°æ®ç¼åï¼æ·»å å½åçæ°æ°æ® else { result.add(onAvg(dataSet)) dataSet.clear() dataSet.add(it) } lastTag = tag } // å表循ç¯ç»æåï¼è¥ç¼åå表ä¸ä»ææ°æ®ï¼åè®¡ç®æåä¸ä¸ªåå¼ if (dataSet.isNotEmpty()) { result.add(onAvg(dataSet)) } return result } private fun clear() { lastTag = null dataSet.clear() result.clear() } } src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,11 @@ package com.flightfeather.uav.dataprocess data class AvgPair( var t: Float, var c: Int ){ fun avg(): Float = if (c == 0) { 0f } else { t / c } } src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt
@@ -1,13 +1,19 @@ package com.flightfeather.uav.domain.entity import com.flightfeather.uav.common.utils.DateUtil import com.flightfeather.uav.dataprocess.AvgPair import com.flightfeather.uav.lightshare.bean.DataVo import com.flightfeather.uav.socket.bean.AirData import com.flightfeather.uav.socket.eunm.FactorType import java.math.BigDecimal import java.time.LocalDateTime import java.time.ZoneId import java.time.ZoneOffset import java.util.* import javax.persistence.Column import javax.persistence.Id import kotlin.math.cos import kotlin.math.sin /** * 宿¶çæµæ°æ®åºç±» @@ -103,4 +109,153 @@ add(AirData().apply { setData(FactorType.HEIGHT, height) }) } } } fun List<RealTimeDataGrid>.avg(): RealTimeDataGrid { //é£åéç¨åä½ç¢éæ³æ±ååå¼ var u = 0f//ä¸è¥¿æ¹ä½åéæ»å var v = 0f//ååæ¹ä½åéæ»å var c = 0//é£åæ°æ®è®¡æ° //é¤é£åå¤çå ¶ä»å åéç¨ç®æ¯å¹³åæ³æ±ååå¼ val tmpList = mutableListOf<AvgPair>() repeat(17) { tmpList.add(AvgPair(0f, 0)) } forEach { //é£å it.windDirection?.let {w -> u += sin(w) v += cos(w) c++ } //å ¶ä½å å tmpList[0].apply { it.latitude?.let { t += it.toFloat() this.c++ } } tmpList[1].apply { it.longitude?.let { t += it.toFloat() this.c++ } } tmpList[2].apply { it.altitude?.let { t += it this.c++ } } tmpList[3].apply { it.no2?.let { t += it this.c++ } } tmpList[4].apply { it.co?.let { t += it this.c++ } } tmpList[5].apply { it.h2s?.let { t += it this.c++ } } tmpList[6].apply { it.so2?.let { t += it this.c++ } } tmpList[7].apply { it.o3?.let { t += it this.c++ } } tmpList[8].apply { it.pm25?.let { t += it this.c++ } } tmpList[9].apply { it.pm10?.let { t += it this.c++ } } tmpList[10].apply { it.temperature?.let { t += it this.c++ } } tmpList[11].apply { it.humidity?.let { t += it this.c++ } } tmpList[12].apply { it.voc?.let { t += it this.c++ } } tmpList[13].apply { it.noi?.let { t += it this.c++ } } tmpList[14].apply { it.velocity?.let { t += it this.c++ } } tmpList[15].apply { it.windSpeed?.let { t += it this.c++ } } tmpList[16].apply { it.height?.let { t += it this.c++ } } } return RealTimeDataGrid().apply { val time = LocalDateTime.ofInstant(get(0).dataTime?.toInstant(), ZoneId.systemDefault()).withSecond(0) deviceCode = get(0).deviceCode dataTime = Date.from(time.atZone(ZoneId.systemDefault()).toInstant()) createTime = dataTime latitude = tmpList[0].avg().toBigDecimal() longitude = tmpList[1].avg().toBigDecimal() altitude = tmpList[2].avg() no2 = tmpList[3].avg() co = tmpList[4].avg() h2s = tmpList[5].avg() so2 = tmpList[6].avg() o3 = tmpList[7].avg() pm25 = tmpList[8].avg() pm10 = tmpList[9].avg() temperature = tmpList[10].avg() humidity = tmpList[11].avg() voc = tmpList[12].avg() noi = tmpList[13].avg() velocity = tmpList[14].avg() windSpeed = tmpList[15].avg() height = tmpList[16].avg() } } src/main/kotlin/com/flightfeather/uav/domain/entity/RealTimeDataGrid.java
@@ -6,4 +6,5 @@ @Table(name = "real_time_data_grid") public class RealTimeDataGrid extends BaseRealTimeData { } src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt
@@ -4,6 +4,7 @@ import com.flightfeather.uav.common.utils.ExcelUtil import com.flightfeather.uav.common.utils.FileExchange import com.flightfeather.uav.common.utils.GsonUtils import com.flightfeather.uav.dataprocess.AverageUtil import com.flightfeather.uav.domain.entity.* import com.flightfeather.uav.domain.mapper.RealTimeDataGridMapper import com.flightfeather.uav.domain.mapper.RealTimeDataMapper @@ -276,17 +277,28 @@ var total = -1 var count = 0 val minFormatter = SimpleDateFormat("yyyy-MM-dd HH:mm") val averageUtil = AverageUtil<RealTimeDataGrid>({d -> minFormatter.format(d.dataTime) },{list -> list.avg() }) while (total == -1 || page <= total) { println("------start------") val res = getOriginData("0d0000000001", "2021-07-05 19:47:01", "2021-11-05 00:00:00", page, 50000) res.head?.let { total = it.totalPage } val p = PageHelper.startPage<RealTimeDataGrid>(page, 50000) val res = realTimeDataGridMapper.selectByExample(Example(RealTimeDataGrid::class.java).apply { createCriteria().andBetween("dataTime", "2021-06-01 00:00:00", "2021-11-05 00:00:00") }) total = p.pages if (page == 1) { println("æ»é¡µæ°ï¼$total") } println("å½å页æ°ï¼$page") res.data?.forEach { averageUtil.avg(res).forEach { }