src/main/kotlin/com/flightfeather/uav/dataprocess/AverageUtil.kt
@@ -2,7 +2,7 @@ /** * åå¼è®¡ç®å·¥å ·ï¼å°ä¸ç»è¿ç»æ°æ®è½¬æ¢ä¸ºèªå®ä¹å¨æçå弿°æ® * è¦æ±ä¼ å ¥çæ°æ®æç §æ¶é´é¡ºåºæåï¼ * è¦æ±ä¼ å ¥çæ°æ®æç §æ¶é´é¡ºåºæ£åºæåï¼ * @param onTag å®ä¹æ°æ®æ ç¾è·ååè°å½æ°ï¼å½å½åæ°æ®æ ç¾ä¸ä¸ä¸ªæ°æ®æ ç¾ä¸åæ¶ï¼å³è®¤ä¸ºä¸ä¸ç»æ°æ®ä¸ºåä¸ç»æ°æ®ï¼éæ±åºåå¼ * @param onAvg å®ä¹åå¼è®¡ç®æ¹æ³ */ @@ -26,11 +26,11 @@ // 计ç®åå¼ list.forEach { val tag = onTag(it) // ç¬¬ä¸æ¡æ°æ®åtagç¸åæ¶ï¼å°æ°æ®æ¾å ¥ä¸´æ¶ç¼åå表 // æ¯ç¬¬ä¸æ¡æ°æ®ætagç¸åæ¶ï¼å°æ°æ®æ¾å ¥ä¸´æ¶ç¼åå表 if (lastTag == null || tag == lastTag) { dataSet.add(it) } // å½tagä¸åæ¶ï¼è®¡ç®ä¹åæ°æ®çåå¼ï¼åæ¶æ åµä¸´æ¶æ°æ®ç¼åï¼æ·»å å½åçæ°æ°æ® // å½tagä¸åæ¶ï¼è®¡ç®ä¹åæ°æ®çåå¼ï¼åæ¶æ¸ ç©ºä¸´æ¶æ°æ®ç¼åï¼æ·»å å½åçæ°æ°æ® else { result.add(onAvg(dataSet)) dataSet.clear() src/main/kotlin/com/flightfeather/uav/dataprocess/AvgPair.kt
@@ -2,9 +2,17 @@ import kotlin.math.round /** * åå¼è®¡ç®ä¸é´é * @param t æ»å * @param c æ»æ° */ data class AvgPair( var t: Float, var c: Int ){ /** * 计ç®ç»æ */ fun avg(): Float = if (c == 0) { 0f } else { src/main/kotlin/com/flightfeather/uav/dataprocess/ElectricDailyAnalysis.kt
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,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 } } src/main/kotlin/com/flightfeather/uav/domain/mapper/CompanyDeviceMapper.kt
@@ -5,4 +5,4 @@ import org.apache.ibatis.annotations.Mapper @Mapper interface CompanyDeviceMapper : MyMapper<CompanyDevice?> interface CompanyDeviceMapper : MyMapper<CompanyDevice> src/main/kotlin/com/flightfeather/uav/domain/mapper/ElectricMinuteValueMapper.kt
@@ -5,4 +5,4 @@ import org.apache.ibatis.annotations.Mapper @Mapper interface ElectricMinuteValueMapper : MyMapper<ElectricMinuteValue?> interface ElectricMinuteValueMapper : MyMapper<ElectricMinuteValue> src/main/kotlin/com/flightfeather/uav/lightshare/bean/ElectricDailyInfo.kt
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,92 @@ package com.flightfeather.uav.lightshare.bean import com.flightfeather.uav.domain.entity.CompanyDevice import com.flightfeather.uav.lightshare.eunm.ElectricityType import java.util.* /** * ç¨çµéæ¥åæç»æ * Date 2021/12/1 15:23 * Created by feiyu */ class ElectricDailyInfo { var day: String = "" /***********产线设å¤ProductionLine, pl************/ private var plDCode: String? = null // 设å¤ç¼å· private var plSTime: Date? = null // å¼å¯æ¶é´ private var plETime: Date? = null // å ³éæ¶é´ private var plRunTime: Int = 0 // è¿è¡æ¶é¿ï¼åéï¼ private var plRunPeriod = mutableListOf<Int>()// è¿è¡æ¶æ®µï¼å°æ¶ï¼ /***********åå设å¤Purify, pf********************/ private var pfDCode: String? = null private var pfSTime: Date? = null private var pfETime: Date? = null private var pfRunTime: Int = 0 private var pfRunPeriod = mutableListOf<Int>() private var dailyResult: String = ""// 彿¥åæç»ææè¿° // å½å设å¤ç±»åï¼ç¨äºæå ¥æ°æ®æ¶å³å®èµå¼å段 private var deviceType: ElectricityType = ElectricityType.ProductionLine fun changeType(d: CompanyDevice?) { deviceType = when (d?.cdType) { ElectricityType.ProductionLine.value -> { plDCode = d.cdDeviceCode ElectricityType.ProductionLine } ElectricityType.Purify.value -> { pfDCode = d.cdDeviceCode ElectricityType.Purify } else -> ElectricityType.UnKnow } } fun setStartTime(date: Date) { when (deviceType) { ElectricityType.ProductionLine -> plSTime = date ElectricityType.Purify -> pfSTime = date else -> Unit } } fun setEndTime(date: Date) { when (deviceType) { ElectricityType.ProductionLine -> plETime = date ElectricityType.Purify -> pfETime = date else -> Unit } } /** * å¢å è¿è¡æ¶é¿ */ fun addRunTime(min: Int) { when (deviceType) { ElectricityType.ProductionLine -> plRunTime += min ElectricityType.Purify -> pfRunTime += min else -> Unit } } /** * æ·»å è¿è¡æ¶æ®µ(å°æ¶) */ fun addRunPeriod(hour: Int) { when (deviceType) { ElectricityType.ProductionLine -> if (!plRunPeriod.contains(hour)) plRunPeriod += hour ElectricityType.Purify -> if (!pfRunPeriod.contains(hour)) pfRunPeriod += hour else -> Unit } } /** * ç»è®¡å¾åºå½æ¥åæç»æ */ fun getResult() { // 1. 设å¤å¼å¯å ³éæ¯å¦åè§ // val timeDiff = } } src/main/kotlin/com/flightfeather/uav/lightshare/eunm/ElectricityType.kt
@@ -8,5 +8,7 @@ //äº§çº¿è®¾å¤ ProductionLine(0), //ååè®¾å¤ Purify(1) Purify(1), //æªç¥è®¾å¤ UnKnow(99), } src/main/kotlin/com/flightfeather/uav/lightshare/service/ElectricityService.kt
@@ -3,6 +3,7 @@ import com.flightfeather.uav.domain.entity.ElectricMinuteValue import com.flightfeather.uav.lightshare.bean.BaseResponse import com.flightfeather.uav.lightshare.bean.DataVo import com.flightfeather.uav.lightshare.bean.ElectricDailyInfo import com.flightfeather.uav.lightshare.bean.ElectricVo interface ElectricityService { @@ -13,5 +14,13 @@ fun getByCompany(cId:String):BaseResponse<List<ElectricMinuteValue>> /** * è·åä¼ä¸ç¨çµéæ´åæ°æ® */ fun getElectricityInfo(cId: String, startTime: String?, endTime: String?, page: Int?, perPage: Int?): BaseResponse<List<ElectricVo>> /** * ä¼ä¸ç¨çµéæ¥ç»è®¡ä¿¡æ¯ */ fun dailyStatistics(cId: String, startTime: String?, endTime: String?): BaseResponse<List<ElectricDailyInfo>> } src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt
@@ -1,25 +1,26 @@ package com.flightfeather.uav.lightshare.service.impl import com.flightfeather.uav.common.utils.DateUtil import com.flightfeather.uav.dataprocess.ElectricDailyAnalysis import com.flightfeather.uav.domain.entity.CompanyDevice import com.flightfeather.uav.domain.entity.ElectricMinuteValue import com.flightfeather.uav.domain.entity.toAirData import com.flightfeather.uav.domain.mapper.CompanyDeviceMapper import com.flightfeather.uav.domain.mapper.ElectricMinuteValueMapper import com.flightfeather.uav.lightshare.bean.BaseResponse import com.flightfeather.uav.lightshare.bean.DataHead import com.flightfeather.uav.lightshare.bean.DataVo import com.flightfeather.uav.lightshare.bean.ElectricVo import com.flightfeather.uav.lightshare.bean.* import com.flightfeather.uav.lightshare.eunm.ElectricityType import com.flightfeather.uav.lightshare.service.ElectricityService import com.flightfeather.uav.socket.bean.AirData import com.github.pagehelper.PageHelper import org.springframework.format.annotation.DateTimeFormat import org.springframework.stereotype.Service import tk.mybatis.mapper.entity.Example import java.text.SimpleDateFormat import java.time.LocalDate import java.time.LocalDateTime import java.time.ZoneId import java.time.format.DateTimeFormatter import java.time.format.DateTimeParseException import kotlin.math.round @Service @@ -29,11 +30,9 @@ private var dateFormatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") private var dateFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm") private var dateFormatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") override fun getMinuteData( deviceCode: String, startTime: String?, endTime: String?, page: Int?, perPage: Int? ): BaseResponse<List<ElectricMinuteValue>> { override fun getMinuteData(deviceCode: String, startTime: String?, endTime: String?, page: Int?, perPage: Int?): BaseResponse<List<ElectricMinuteValue>> { val perP = perPage ?: 60 val p = page ?: 1 val sTime = startTime?.let { dateFormatter.parse(it) } @@ -277,6 +276,12 @@ return BaseResponse(true, head = DataHead(pageInfo.pageNum, pageInfo.pages), data = result) } /** * è·å设å¤å½åè¿è¡ç¶æ * @param e 设å¤ç¨çµéçæµæ°æ® * @param d ä¼ä¸è®¾å¤ä¿¡æ¯ * @return æ°æ®å¯¹åºç»æä¿¡æ¯ï¼<ç¶æç¼å·ï¼ç¶ææè¿°ï¼çµæµåå¼> */ private fun getStatus(e: ElectricMinuteValue?, d: CompanyDevice?): Triple<String, String, Double> { var values = mutableListOf<Int>().apply { d?.cdLimits?.split(";")?.forEach { @@ -305,4 +310,44 @@ } return Triple(status.last(), statusNames.last(), avg) } override fun dailyStatistics(cId: String, startTime: String?, endTime: String?): BaseResponse<List<ElectricDailyInfo>> { // æ ¹æ®ä¼ä¸idè·å对åºè®¾å¤ val devices = companyDeviceMapper.selectByExample(Example(CompanyDevice::class.java).apply { createCriteria().andEqualTo("cdCompanyId", cId) }) val deviceCodeList = mutableListOf<String>() devices.forEach { it?.let { deviceCodeList.add(it.cdDeviceCode) }} val st:LocalDateTime val et:LocalDateTime // 彿²¡æå¼å§æç»ææ¶é´æ¶ï¼ä½¿ç¨ææ°ä¸æ¡æ°æ®æ¶é´çå½å¤©ä½ä¸ºç»è®¡æ¶é´ if (startTime == null || endTime == null) { val em = electricMinuteValueMapper.selectOneByExample(Example(ElectricMinuteValue::class.java).apply { createCriteria().andIn("mvStatCode", deviceCodeList) orderBy("mvDataTime").desc() }) val dataTime = LocalDateTime.ofInstant(em?.mvDataTime?.toInstant(), ZoneId.systemDefault()) st = dataTime.withHour(0).withMinute(0).withSecond(0) et = dataTime.withHour(23).withMinute(59).withSecond(59) } // 彿å¼å§ç»ææ¶é´æ¶ï¼å¤ææ ¼å¼æ¯å¦æ£ç¡® else { try { st = LocalDateTime.parse(startTime, dateFormatter3).withHour(0).withMinute(0).withSecond(0) et = LocalDateTime.parse(endTime, dateFormatter3).withHour(23).withMinute(59).withSecond(59) } catch (e: DateTimeParseException) { return BaseResponse(false, "æ¶é´æ ¼å¼é误ï¼åºä¸ºyyyy-MM-dd hh:mm:dd") } } val dataList = electricMinuteValueMapper.selectByExample(Example(ElectricMinuteValue::class.java).apply { createCriteria().andIn("mvStatCode", deviceCodeList) .andBetween("mvDataTime", st, et) orderBy("mvDataTime") }) val result = ElectricDailyAnalysis.analysis(devices, dataList) return BaseResponse(true, data = result) } } src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImplTest.kt
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ package com.flightfeather.uav.lightshare.service.impl import com.flightfeather.uav.lightshare.service.ElectricityService import org.junit.Test import org.junit.Assert.* import org.junit.runner.RunWith import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.test.context.junit4.SpringRunner /** * Date 2021/12/1 16:49 * Created by feiyu */ @RunWith(SpringRunner::class) @SpringBootTest class ElectricityServiceImplTest { @Autowired lateinit var electricityService: ElectricityService @Test fun dailyStatistics() { val r = electricityService.dailyStatistics("J3euwNl19WZvH7iE", "2021-07-16 00:00:00", "2021-07-16 00:00:00") println(r) } }