src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/ElectricityServiceImpl.kt
@@ -9,12 +9,16 @@
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.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(
@@ -22,6 +26,7 @@
) : 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?,
@@ -86,4 +91,170 @@
        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: String? = null
        //废气净化装置
        var d2: String? = null
        deviceCodeList.forEach {
            // FIXME: 2021/11/5 此处暂时写死,后续修改
            if (it?.cdDeviceCode == "31011020210602" || it?.cdDeviceCode == "31011020210603") {
                d1 = it.cdDeviceCode
            }else if (it?.cdDeviceCode == "31011020210601" || it?.cdDeviceCode == "31011020210604") {
                d2 = it.cdDeviceCode
            }
        }
        var pageInfo = PageHelper.startPage<ElectricMinuteValue>(p, perP)
        val dataList1 = electricMinuteValueMapper.selectByExample(Example(ElectricMinuteValue::class.java).apply {
            createCriteria().andEqualTo("mvStatCode", d1)
                .apply {
                    sTime?.let { andGreaterThanOrEqualTo("mvDataTime", it) }
                    eTime?.let { andLessThanOrEqualTo("mvDataTime", it) }
                }
            orderBy("mvDataTime").apply {
                // 当请求接口不传递起始时间,默认获取最新的数据
                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)
                .apply {
                    sTime?.let { andGreaterThanOrEqualTo("mvDataTime", it) }
                    eTime?.let { andLessThanOrEqualTo("mvDataTime", it) }
                }
            orderBy("mvDataTime").apply {
                // 当请求接口不传递起始时间,默认获取最新的数据
                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
                            d1Status = getStatus(d)
                        }
                        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
                            d2Status = getStatus(d)
                        }
                        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?): String {
        var values = listOf(1, 100)
        var status = listOf("0", "2", "3")
        if (e == null) {
            return status.first()
        }
        when (e.mvStatCode) {
            "31011020210601" -> {
                values = listOf(1, 100)
                status = listOf("0", "2", "3")
            }
            "31011020210602" -> {
                values = listOf(13, 30)
                status = listOf("0", "2", "3")
            }
            "31011020210603" -> {
                values = listOf(1, 50, 80)
                status = listOf("0", "1", "2", "3")
            }
            "31011020210604" -> {
                values = listOf(15, 90, 125)
                status = listOf("0", "1", "2", "3")
            }
        }
        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 status[i]
            }
        }
        return status.last()
    }
}