From bf3bf9ff25ac106b556b2427cc382c8fcca63bff Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期二, 02 七月 2024 17:38:33 +0800
Subject: [PATCH] 1. 新增走航报告自动道路识别模块
---
src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/DataAnalysisConfig.kt | 5
src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionAnalysis.kt | 8 +
src/main/kotlin/com/flightfeather/uav/common/net/AMapService.kt | 19 +++
src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt | 9 +
src/main/resources/templates/report-underway.ftl | 2
src/main/kotlin/com/flightfeather/uav/common/net/SkipCertificateValidation.kt | 150 +++++++++++++++++++++++++
src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/ExceptionAnalysisController.kt | 28 ++++
src/main/kotlin/com/flightfeather/uav/common/net/HttpMethod.kt | 92 +++++++++++++++
src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt | 2
pom.xml | 6 +
10 files changed, 309 insertions(+), 12 deletions(-)
diff --git a/pom.xml b/pom.xml
index c6f7fd6..1db1d29 100644
--- a/pom.xml
+++ b/pom.xml
@@ -211,6 +211,12 @@
<artifactId>jfreechart</artifactId>
<version>1.5.3</version>
</dependency>
+
+ <dependency>
+ <groupId>commons-httpclient</groupId>
+ <artifactId>commons-httpclient</artifactId>
+ <version>3.0</version>
+ </dependency>
</dependencies>
<build>
diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionAnalysis.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionAnalysis.kt
index 139166f..41323f0 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionAnalysis.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/BaseExceptionAnalysis.kt
@@ -6,6 +6,7 @@
import com.flightfeather.uav.biz.dataanalysis.model.ExceptionType
import com.flightfeather.uav.common.utils.DateUtil
import com.flightfeather.uav.domain.entity.BaseRealTimeData
+import com.flightfeather.uav.domain.entity.avg
import com.flightfeather.uav.socket.eunm.FactorType
import java.time.Duration
@@ -54,6 +55,11 @@
startData = start.getByFactorType(factor.main)
endData = end?.getByFactorType(factor.main) ?: startData
+ val avgData = exceptionData.avg()
+ // 姹傚彇姹℃煋鏁版嵁鐨勪腑蹇冨潗鏍�
+ longitude = avgData.longitude
+ latitude = avgData.latitude
+ // 姹傚彇涓绘薄鏌撳洜瀛愮殑鍧囧�煎拰鑼冨洿
val s = dataSummary(exceptionData, factor.main)
avg = s.first
min = s.second
@@ -63,7 +69,7 @@
}
}
- fun dataSummary(exceptionData: List<BaseRealTimeData?>, factorType: FactorType): Triple<Float, Float, Float> {
+ private fun dataSummary(exceptionData: List<BaseRealTimeData?>, factorType: FactorType): Triple<Float, Float, Float> {
var min = -1f
var max = -1f
var total = 0f
diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/ExceptionAnalysisController.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/ExceptionAnalysisController.kt
index d73f3a7..5080123 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/ExceptionAnalysisController.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/ExceptionAnalysisController.kt
@@ -7,6 +7,7 @@
import com.flightfeather.uav.biz.dataanalysis.model.DataAnalysisConfig
import com.flightfeather.uav.biz.dataanalysis.model.ExceptionResult
import com.flightfeather.uav.biz.dataanalysis.model.ExceptionSetting
+import com.flightfeather.uav.common.location.LocationRoadNearby
import com.flightfeather.uav.domain.entity.Mission
import com.flightfeather.uav.domain.repository.RealTimeDataRep
import org.springframework.stereotype.Component
@@ -17,6 +18,7 @@
@Component
class ExceptionAnalysisController(
private val realTimeDataRep: RealTimeDataRep,
+ private val locationRoadNearby: LocationRoadNearby,
) {
var running = false
@@ -26,15 +28,15 @@
private fun initTask(config: DataAnalysisConfig) {
taskList.clear()
taskList.apply {
-// add(ExceptionDataExceed(config))
-// add(ExceptionValueMutation(config))
+ add(ExceptionDataExceed(config))
+ add(ExceptionValueMutation(config))
add(ExceptionSlideAverage(config))
}
}
fun run(mission: Mission, factorFilter: FactorFilter): List<ExceptionResult> {
running = true
- val config = DataAnalysisConfig(mission, ExceptionSetting(), 8, factorFilter)
+ val config = DataAnalysisConfig(mission, ExceptionSetting(), factorFilter)
initTask(config)
val result = mutableListOf<ExceptionResult>()
@@ -45,8 +47,26 @@
}
// 鍚勪釜寮傚父鍒嗘瀽鍒嗗埆缁撴潫
taskList.forEach { it.onDone() }
- // 瀛樺偍鍒嗘瀽缁撴灉
+
taskList.forEach {
+ // 鏌ヨ寮傚父鍛ㄨ竟鍙兘姹℃煋婧�
+ it.resultList.forEach { r->
+ if (r.longitude != null && r.latitude != null) {
+ val sceneList = locationRoadNearby.searchByRadius(
+ r.longitude!!.toDouble() to r.latitude!!.toDouble(), config.radius)
+ if (sceneList.isNotEmpty()) {
+ val idList = mutableListOf<String>()
+ val nameList = mutableListOf<String>()
+ sceneList.forEach { s->
+ idList.add(s?.guid?:"")
+ nameList.add(s?.name ?: "")
+ }
+ r.relatedSceneId = idList
+ r.relatedSceneName = nameList
+ }
+ }
+ }
+ // 瀛樺偍鍒嗘瀽缁撴灉
result.addAll(it.resultList)
}
running = false
diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/DataAnalysisConfig.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/DataAnalysisConfig.kt
index 877df87..bbc7b00 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/DataAnalysisConfig.kt
+++ b/src/main/kotlin/com/flightfeather/uav/biz/dataanalysis/model/DataAnalysisConfig.kt
@@ -11,8 +11,6 @@
val mission: Mission,
// 鏁版嵁寮傚父閰嶇疆
val exceptionSetting: ExceptionSetting,
- // 娑夊強鐩戞祴鍥犲瓙鏁伴噺
- val factorCount: Int,
// 鍥犲瓙绛涢��
val factorFilter: FactorFilter,
){
@@ -28,4 +26,7 @@
var changeTrendRate = 1
// 婊戝姩骞冲潎鍊煎彉鍖栫巼寮傚父杩炵画娆℃暟
var changeTrendTimes = 3
+
+ // 寮傚父鍛ㄨ竟鍙兘姹℃煋婧愭煡璇㈣寖鍥村崐寰勶紙绫筹級
+ var radius = 500.0
}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/common/net/AMapService.kt b/src/main/kotlin/com/flightfeather/uav/common/net/AMapService.kt
new file mode 100644
index 0000000..f4aa432
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/common/net/AMapService.kt
@@ -0,0 +1,19 @@
+package com.flightfeather.uav.common.net
+
+/**
+ * 楂樺痉鍦板浘Web鏈嶅姟API
+ */
+object AMapService {
+
+ private val httpMethod = HttpMethod("restapi.amap.com", 443, true)
+ private val KEY = ""
+
+ /**
+ * 鍦扮悊閫嗙紪鐮�
+ */
+ fun reGeo(location:List<Pair<Double, Double>>) {
+ httpMethod.get("v3/geocode/regeo", listOf(
+
+ ))
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/common/net/HttpMethod.kt b/src/main/kotlin/com/flightfeather/uav/common/net/HttpMethod.kt
new file mode 100644
index 0000000..350f640
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/common/net/HttpMethod.kt
@@ -0,0 +1,92 @@
+package com.flightfeather.uav.common.net
+
+import org.apache.commons.httpclient.HttpClient
+import org.apache.commons.httpclient.HttpMethodBase
+import org.apache.commons.httpclient.methods.GetMethod
+import org.apache.commons.httpclient.methods.PostMethod
+import org.apache.commons.httpclient.methods.StringRequestEntity
+import org.apache.commons.httpclient.protocol.Protocol
+import org.slf4j.LoggerFactory
+
+/**
+ * @author riku
+ * Date: 2020/10/14
+ */
+class HttpMethod(
+ private val host: String, private val port: Int, private val isHttps: Boolean = false
+) {
+ private val logger = LoggerFactory.getLogger(HttpMethod::class.java)
+
+ data class MyResponse(
+ val success: Boolean,
+ val m: HttpMethodBase
+ )
+
+ object Head {
+ val TEXT_PLAIN = Pair("Content-Type", "text/plain")
+ }
+
+ private val httpClient = HttpClient()
+
+ init {
+ Protocol.registerProtocol("https", Protocol("https", SkipCertificateValidation.MySecureProtocolSocketFactory(), port))
+ if (isHttps) {
+ httpClient.hostConfiguration.setHost(host, port, Protocol.getProtocol("https"))
+ } else {
+ httpClient.hostConfiguration.setHost(host, port)
+ }
+ }
+
+ fun get(url: String, params: List<Pair<String, String>> = emptyList(), headers: List<Pair<String, String>> = emptyList()): MyResponse {
+ var p: String = ""
+ params.forEach {
+ p += if (p.isBlank()) {
+ it.first + "=" + it.second
+ } else {
+ "&" + it.first + "=" + it.second
+ }
+ }
+ val getMethod = GetMethod("$url?$p")
+ defaultConfig(getMethod)
+ headers.forEach {
+ getMethod.setRequestHeader(it.first, it.second)
+ }
+
+ return when (httpClient.executeMethod(getMethod)) {
+ 200 -> MyResponse(true, getMethod)
+ else -> MyResponse(false, getMethod)
+ }
+ }
+
+ fun post(url: String, data: String = "", headers: List<Pair<String, String>> = emptyList()): MyResponse {
+ val postMethod = PostMethod(url)
+ defaultConfig(postMethod)
+ headers.forEach {
+ postMethod.setRequestHeader(it.first, it.second)
+ }
+ if (data.isNotBlank()) {
+ postMethod.requestEntity = StringRequestEntity(data, "application/json", "utf-8")
+ }
+
+ return try {
+ when (httpClient.executeMethod(postMethod)) {
+ 200 -> MyResponse(true, postMethod)
+ else -> MyResponse(false, postMethod)
+ }
+ } catch (e: Exception) {
+ logger.error(e.message)
+ MyResponse(false, postMethod)
+ }
+ }
+
+ private fun defaultConfig(method: HttpMethodBase) {
+ method.setRequestHeader("Accept", "*/*");
+ method.setRequestHeader("Connection", "Keep-Alive");
+// method.setRequestHeader("Accept-Language", "zh-cn,zh;q=0.5");
+ method.setRequestHeader("Accept-Encoding", "gzip,deflate,br");
+// method.setRequestHeader("Content-Type", "application/json;charset=utf-8")
+ method.setRequestHeader("Content-Type", "application/json")
+// method.setRequestHeader("Content-Type", "application/json;charset=GBK")
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/common/net/SkipCertificateValidation.kt b/src/main/kotlin/com/flightfeather/uav/common/net/SkipCertificateValidation.kt
new file mode 100644
index 0000000..8cc7cb1
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/common/net/SkipCertificateValidation.kt
@@ -0,0 +1,150 @@
+package com.flightfeather.uav.common.net
+
+import org.apache.commons.httpclient.ConnectTimeoutException
+import org.apache.commons.httpclient.HttpClientError
+import org.apache.commons.httpclient.params.HttpConnectionParams
+import org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory
+import org.apache.commons.httpclient.protocol.ProtocolSocketFactory
+import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory
+import java.io.IOException
+import java.net.InetAddress
+import java.net.Socket
+import java.net.UnknownHostException
+import java.security.cert.CertificateException
+import java.security.cert.X509Certificate
+import javax.net.ssl.*
+
+
+/**
+ * 閫氳繃java 杩涜璁块棶鏈夋椂鍊欎細鏈夎瘉涔﹁繘琛屾嫤鎴�
+ */
+object SkipCertificateValidation {
+ /**
+ * 蹇界暐HTTPS璇锋眰鐨凷SL璇佷功锛屽繀椤诲湪openConnection涔嬪墠璋冪敤
+ * @throws Exception
+ */
+ @Throws(Exception::class)
+ fun ignoreSsl() {
+ val hv = HostnameVerifier { urlHostName, session ->
+ println("Warning: URL Host: " + urlHostName + " vs. " + session.peerHost)
+ true
+ }
+ trustAllHttpsCertificates()
+ HttpsURLConnection.setDefaultHostnameVerifier(hv)
+ }
+
+ @Throws(Exception::class)
+ private fun trustAllHttpsCertificates() {
+ val trustAllCerts = arrayOfNulls<TrustManager>(1)
+ val tm: TrustManager = MiTM()
+ trustAllCerts[0] = tm
+ val sc = SSLContext.getInstance("SSL")
+ sc.init(null, trustAllCerts, null)
+ HttpsURLConnection.setDefaultSSLSocketFactory(sc.socketFactory)
+ }
+
+ internal class MiTM : X509TrustManager {
+ override fun getAcceptedIssuers(): Array<X509Certificate>? {
+ return null
+ }
+
+ @Throws(CertificateException::class)
+ override fun checkServerTrusted(certs: Array<X509Certificate>, authType: String) {
+ return
+ }
+
+ @Throws(CertificateException::class)
+ override fun checkClientTrusted(certs: Array<X509Certificate>, authType: String) {
+ return
+ }
+ }
+
+ class MySecureProtocolSocketFactory : ProtocolSocketFactory {
+ //杩欓噷娣诲姞涓�涓睘鎬э紝涓昏鐩殑灏辨槸鏉ヨ幏鍙杝sl璺宠繃楠岃瘉
+ private var sslContext: SSLContext? = null
+
+ /**
+ * 鍒ゆ柇鑾峰彇SSLContext
+ * @return
+ */
+ private val sSLContext: SSLContext?
+ get() {
+ if (sslContext == null) {
+ sslContext = createEasySSLContext()
+ }
+ return sslContext
+ }
+
+ //鍚庨潰鐨勬柟娉曞熀鏈笂灏辨槸甯﹀叆鐩稿叧鍙傛暟灏卞彲浠ヤ簡
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket(java.lang.String,
+ * int, java.net.InetAddress, int)
+ */
+ @Throws(IOException::class, UnknownHostException::class)
+ override fun createSocket(host: String, port: Int, clientHost: InetAddress?, clientPort: Int): Socket {
+ return sSLContext!!.socketFactory.createSocket(host, port, clientHost, clientPort)
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket(java.lang.String,
+ * int, java.net.InetAddress, int,
+ * org.apache.commons.httpclient.params.HttpConnectionParams)
+ */
+ @Throws(IOException::class, UnknownHostException::class, ConnectTimeoutException::class)
+ override fun createSocket(
+ host: String, port: Int, localAddress: InetAddress?, localPort: Int,
+ params: HttpConnectionParams?
+ ): Socket {
+ requireNotNull(params) { "Parameters may not be null" }
+ val timeout: Int = params.connectionTimeout
+ return if (timeout == 0) {
+ createSocket(host, port, localAddress, localPort)
+ } else {
+ ControllerThreadSocketFactory.createSocket(this, host, port, localAddress, localPort, timeout)
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see SecureProtocolSocketFactory#createSocket(java.lang.String,int)
+ */
+ @Throws(IOException::class, UnknownHostException::class)
+ override fun createSocket(host: String, port: Int): Socket {
+ return sSLContext!!.socketFactory.createSocket(host, port)
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see SecureProtocolSocketFactory#createSocket(java.net.Socket,java.lang.String,int,boolean)
+ */
+// @Throws(IOException::class, UnknownHostException::class)
+// override fun createSocket(socket: Socket?, host: String?, port: Int, autoClose: Boolean): Socket {
+// return sSLContext!!.socketFactory.createSocket(socket, host, port, autoClose)
+// }
+
+ companion object {
+ /**
+ * 杩欎釜鍒涘缓涓�涓幏鍙朣SLContext鐨勬柟娉曪紝瀵煎叆MyX509TrustManager杩涜鍒濆鍖�
+ * @return
+ */
+ private fun createEasySSLContext(): SSLContext {
+ return try {
+ val context = SSLContext.getInstance("SSL")
+ context.init(
+ null, arrayOf(MiTM()),
+ null
+ )
+ context
+ } catch (e: Exception) {
+ throw HttpClientError(e.toString())
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt b/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt
index 8c9f9df..3628094 100644
--- a/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt
+++ b/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt
@@ -1,7 +1,7 @@
package com.flightfeather.uav.domain.entity
-import com.flightfeather.uav.common.utils.DateUtil
import com.flightfeather.uav.biz.dataprocess.AvgPair
+import com.flightfeather.uav.common.utils.DateUtil
import com.flightfeather.uav.lightshare.bean.DataVo
import com.flightfeather.uav.socket.bean.AirData
import com.flightfeather.uav.socket.eunm.FactorType
@@ -11,7 +11,10 @@
import java.util.*
import javax.persistence.Column
import javax.persistence.Id
-import kotlin.math.*
+import kotlin.math.atan
+import kotlin.math.cos
+import kotlin.math.round
+import kotlin.math.sin
/**
* 瀹炴椂鐩戞祴鏁版嵁鍩虹被
@@ -148,7 +151,7 @@
}
-fun List<BaseRealTimeData>.avg(): RealTimeDataGridMin {
+fun List<BaseRealTimeData>.avg(): BaseRealTimeData {
//椋庡悜閲囩敤鍗曚綅鐭㈤噺娉曟眰鍙栧潎鍊�
var u = .0//涓滆タ鏂逛綅鍒嗛噺鎬诲拰
var v = .0//鍗楀寳鏂逛綅鍒嗛噺鎬诲拰
diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt
index 7e541ff..f90a5e6 100644
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt
@@ -374,7 +374,7 @@
val averageUtil = AverageUtil<RealTimeDataGridOpt, RealTimeDataGridMin>({ d ->
minFormatter.format(d.dataTime)
}, { list ->
- list.avg()
+ list.avg() as RealTimeDataGridMin
})
while (total == -1 || page <= total) {
diff --git a/src/main/resources/templates/report-underway.ftl b/src/main/resources/templates/report-underway.ftl
index 73f9bad..0077dd0 100644
--- a/src/main/resources/templates/report-underway.ftl
+++ b/src/main/resources/templates/report-underway.ftl
@@ -1252,7 +1252,7 @@
<w:szCs w:val="28" />
<w:lang w:val="en-US" w:eastAsia="zh-CN" />
</w:rPr>
- <w:t>${item_index + 1}. 浠�${item.startTime}鑷�${item.endTime}锛�${item.factorName}鍑虹幇${item.exception}<#if item.relatedSceneName??>锛岀粨鍚堢洃娴嬫暟鎹彉鍖栧拰鍙楃偣鍙嶅悜婧簮锛�<#list item.relatedSceneName as scene>${scene}銆�</#list>绛夊彲鑳藉瓨鍦ㄦ薄鏌撻闄┿��<#else>銆�</#if></w:t>
+ <w:t>${item_index + 1}. 浠�${item.startTime}鑷�${item.endTime}锛�${item.factorName}鍑虹幇${item.exception}<#if item.relatedSceneName??>锛岀粨鍚堢洃娴嬫暟鎹彉鍖栧拰鍙楃偣鍙嶅悜婧簮锛�<#list item.relatedSceneName as scene><#if (scene_index > 0)>銆�</#if>${scene}</#list>绛夊彲鑳藉瓨鍦ㄦ薄鏌撻闄┿��<#else>銆�</#if></w:t>
</w:r>
</w:p>
<w:p>
--
Gitblit v1.9.3