From 3a7da032ec18b2d5d36afb3fd9622c7d763257b7 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期三, 17 十一月 2021 13:05:06 +0800
Subject: [PATCH] 1. 将用电量接口返回的参数动态化

---
 src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt |  219 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 217 insertions(+), 2 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt
index dd0a575..c6f3e68 100644
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt
@@ -1,19 +1,33 @@
 package com.flightfeather.uav.lightshare.service.impl
 
+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.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.eunm.ElectricityType
 import com.flightfeather.uav.lightshare.service.ElectricityService
+import com.flightfeather.uav.socket.bean.AirData
 import com.github.pagehelper.PageHelper
 import org.springframework.stereotype.Service
 import tk.mybatis.mapper.entity.Example
 import java.text.SimpleDateFormat
+import java.time.LocalDateTime
+import java.time.ZoneId
+import java.time.format.DateTimeFormatter
 
 @Service
-class ElectricityServiceImpl(private val electricMinuteValueMapper: ElectricMinuteValueMapper) : ElectricityService {
+class ElectricityServiceImpl(
+    private val electricMinuteValueMapper: ElectricMinuteValueMapper, private val companyDeviceMapper: CompanyDeviceMapper
+) : ElectricityService {
 
     private var dateFormatter = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
+    private var dateFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
 
     override fun getMinuteData(
         deviceCode: String, startTime: String?,
@@ -31,10 +45,211 @@
                     sTime?.let { andGreaterThanOrEqualTo("mvDataTime", it) }
                     eTime?.let { andLessThanOrEqualTo("mvDataTime", it) }
                 }
-            orderBy("mvDataTime")
+            orderBy("mvDataTime").apply {
+                // 褰撹姹傛帴鍙d笉浼犻�掕捣濮嬫椂闂达紝榛樿鑾峰彇鏈�鏂扮殑鏁版嵁
+                if (startTime == null && endTime == null) {
+                    desc()
+                }
+            }
         }).forEach {
             it?.let { result.add(it) }
         }
+        if (startTime == null && endTime == null) {
+            result.reverse()
+        }
         return BaseResponse(true, head = DataHead(pageInfo.pageNum, pageInfo.pages), data = result)
     }
+
+    override fun getMinuteData2(deviceCode: String, startTime: String?, endTime: String?, page: Int?, perPage: Int?): BaseResponse<List<DataVo>> {
+        val result = mutableListOf<DataVo>()
+        getMinuteData(deviceCode, startTime, endTime, page, perPage).run {
+            data?.forEach {
+                result.add(DataVo(
+                    DateUtil.instance.dateToString(it.mvDataTime, DateUtil.DateStyle.YYYY_MM_DD_HH_MM_SS),
+                    it.mvStatCode,
+                    it.toAirData()
+                ))
+            }
+            return BaseResponse(success, head = head, data = result)
+        }
+    }
+
+    override fun getByCompany(cId: String): BaseResponse<List<ElectricMinuteValue>> {
+        val result = mutableListOf<ElectricMinuteValue>()
+        companyDeviceMapper.selectByExample(Example(CompanyDevice::class.java).apply {
+            createCriteria().andEqualTo("cdCompanyId", cId)
+        }).forEach {
+            val p = PageHelper.startPage<ElectricMinuteValue>(1, 1)
+            electricMinuteValueMapper.selectByExample(Example(ElectricMinuteValue::class.java).apply {
+                createCriteria().andEqualTo("mvStatCode", it?.cdDeviceCode)
+                orderBy("mvDataTime").desc()
+            })?.let {
+                if (it.isNotEmpty()) {
+                    it[0]?.let {e-> result.add(e) }
+                }
+            }
+        }
+
+        return BaseResponse(true, data = result)
+    }
+
+    override fun getElectricityInfo(cId: String, startTime: String?, endTime: String?, page: Int?, perPage: Int?): BaseResponse<List<ElectricVo>> {
+        val perP = perPage ?: 60
+        val p = page ?: 1
+        val sTime = startTime?.let { dateFormatter.parse(it) }
+        val eTime = endTime?.let { dateFormatter.parse(it) }
+        val result = mutableListOf<ElectricVo>()
+        val deviceCodeList = companyDeviceMapper.selectByExample(Example(CompanyDevice::class.java).apply {
+            createCriteria().andEqualTo("cdCompanyId", cId)
+        })
+        //浜х嚎椋庢満
+        var d1: CompanyDevice? = null
+        //搴熸皵鍑�鍖栬缃�
+        var d2: CompanyDevice? = null
+
+        deviceCodeList.forEach {
+            if (it?.cdType == ElectricityType.ProductionLine.value) {
+                d1 = it
+            }else if (it?.cdType == ElectricityType.Purify.value) {
+                d2 = it
+            }
+        }
+
+        var pageInfo = PageHelper.startPage<ElectricMinuteValue>(p, perP)
+        val dataList1 = electricMinuteValueMapper.selectByExample(Example(ElectricMinuteValue::class.java).apply {
+            createCriteria().andEqualTo("mvStatCode", d1?.cdDeviceCode)
+                .apply {
+                    sTime?.let { andGreaterThanOrEqualTo("mvDataTime", it) }
+                    eTime?.let { andLessThanOrEqualTo("mvDataTime", it) }
+                }
+            orderBy("mvDataTime").apply {
+                // 褰撹姹傛帴鍙d笉浼犻�掕捣濮嬫椂闂达紝榛樿鑾峰彇鏈�鏂扮殑鏁版嵁
+                if (startTime == null && endTime == null) {
+                    desc()
+                }
+            }
+        })
+        if (startTime == null && endTime == null) {
+            dataList1.reverse()
+        }
+        pageInfo = PageHelper.startPage<ElectricMinuteValue>(p, perP)
+        val dataList2 = electricMinuteValueMapper.selectByExample(Example(ElectricMinuteValue::class.java).apply {
+            createCriteria().andEqualTo("mvStatCode", d2?.cdDeviceCode)
+                .apply {
+                    sTime?.let { andGreaterThanOrEqualTo("mvDataTime", it) }
+                    eTime?.let { andLessThanOrEqualTo("mvDataTime", it) }
+                }
+            orderBy("mvDataTime").apply {
+                // 褰撹姹傛帴鍙d笉浼犻�掕捣濮嬫椂闂达紝榛樿鑾峰彇鏈�鏂扮殑鏁版嵁
+                if (startTime == null && endTime == null) {
+                    desc()
+                }
+            }
+        })
+        if (startTime == null && endTime == null) {
+            dataList2.reverse()
+        }
+
+        // FIXME: 2021/11/5 杩斿洖缁撴灉闇�瑕佹牴鎹袱鍙拌澶囩殑鏁版嵁濮嬫湯鏃堕棿锛岄�夊彇鏈�闀跨殑涓や釜濮嬫湯鏃堕棿
+        val sT = if (dataList1.isEmpty() && dataList2.isNotEmpty()) {
+            dataList2[0]?.mvDataTime
+        }else if (dataList1.isNotEmpty() && dataList2.isEmpty()) {
+            dataList1[0]?.mvDataTime
+        } else if (dataList1.isNotEmpty() && dataList2.isNotEmpty()) {
+            if (dataList1[0]?.mvDataTime?.after(dataList2[0]?.mvDataTime) == true) {
+                dataList2[0]?.mvDataTime
+            } else {
+                dataList1[0]?.mvDataTime
+            }
+        } else {
+            null
+        }
+        val eT = if (dataList1.isEmpty() && dataList2.isNotEmpty()) {
+            dataList2.last()?.mvDataTime
+        }else if (dataList1.isNotEmpty() && dataList2.isEmpty()) {
+            dataList1.last()?.mvDataTime
+        } else if (dataList1.isNotEmpty() && dataList2.isNotEmpty()) {
+            if (dataList1.last()?.mvDataTime?.after(dataList2.last()?.mvDataTime) == true) {
+                dataList1.last()?.mvDataTime
+            } else {
+                dataList2.last()?.mvDataTime
+            }
+        } else {
+            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) {
+            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)) {
+                        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
+                        }
+                        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)
+                    }
+                }
+                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> {
+        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 Pair(status.first(), statusNames.first())
+        }
+
+        val electricityList = mutableListOf<Double>()
+        electricityList.add(e.mvElectricityA)
+        electricityList.add(e.mvElectricityB)
+        electricityList.add(e.mvElectricityC)
+
+        val avg = electricityList.average()
+        for (i in values.indices) {
+            if (avg < values[i]) {
+                return Pair(status[i], statusNames[i])
+            }
+        }
+        return Pair(status.last(), statusNames.last())
+    }
 }
\ No newline at end of file

--
Gitblit v1.9.3