From 022af485fbd77bc3d6b01f9f779248b3c189dad2 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期四, 04 七月 2024 17:35:33 +0800
Subject: [PATCH] 1. 新增走航报告自动道路识别模块

---
 src/main/kotlin/com/flightfeather/uav/domain/mapper/SegmentInfoMapper.java               |    9 
 src/main/resources/mapper/SegmentInfoMapper.xml                                          |   30 +++
 src/main/resources/generator/generatorConfig.xml                                         |    4 
 src/test/kotlin/com/flightfeather/uav/biz/dataprocess/RoadSegmentTest.kt                 |   28 ++
 src/main/kotlin/com/flightfeather/uav/common/location/TrackSegment.kt                    |   93 +++++++-
 src/main/kotlin/com/flightfeather/uav/domain/entity/SegmentInfo.java                     |  244 ++++++++++++++++++++++++
 src/main/kotlin/com/flightfeather/uav/biz/dataprocess/RoadSegment.kt                     |   67 ++++++
 src/main/kotlin/com/flightfeather/uav/common/net/AMapService.kt                          |   95 +++++++++
 src/main/kotlin/com/flightfeather/uav/domain/repository/SegmentInfoRep.kt                |   18 +
 src/main/kotlin/com/flightfeather/uav/common/net/HttpMethod.kt                           |    4 
 src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/RealTimeDataServiceImpl.kt |    2 
 pom.xml                                                                                  |    2 
 12 files changed, 568 insertions(+), 28 deletions(-)

diff --git a/pom.xml b/pom.xml
index 1db1d29..8436d7e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -97,7 +97,7 @@
         <dependency>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
-            <version>2.8.5</version>
+            <version>2.8.6</version>
         </dependency>
 
         <!--鍒嗛〉-->
diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/RoadSegment.kt b/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/RoadSegment.kt
new file mode 100644
index 0000000..e2fbd29
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/RoadSegment.kt
@@ -0,0 +1,67 @@
+package com.flightfeather.uav.biz.dataprocess
+
+import com.flightfeather.uav.common.location.TrackSegment
+import com.flightfeather.uav.common.net.AMapService
+import com.flightfeather.uav.domain.entity.BaseRealTimeData
+import com.flightfeather.uav.domain.entity.Mission
+import com.flightfeather.uav.domain.entity.SegmentInfo
+import com.flightfeather.uav.domain.entity.avg
+import com.flightfeather.uav.domain.repository.RealTimeDataRep
+import com.flightfeather.uav.domain.repository.SegmentInfoRep
+import org.springframework.stereotype.Component
+import java.math.BigDecimal
+
+/**
+ * 璧拌埅杞ㄨ抗鎸夌収璺杩涜鍒嗗壊
+ * @date 2024/7/4
+ * @author feiyu02
+ */
+@Component
+class RoadSegment(
+    private val realTimeDataRep: RealTimeDataRep,
+    private val segmentInfoRep: SegmentInfoRep,
+) {
+
+    fun handle(mission: Mission) {
+        // 鑾峰彇鏁版嵁鍒嗘
+        val data = mutableListOf<BaseRealTimeData>()
+        realTimeDataRep.fetchData(mission).forEach {
+            // 鍘婚櫎鏃犳晥缁忕含搴�
+            if ((it.longitude != null && it.longitude != BigDecimal.ZERO)
+                && (it.latitude != null && it.latitude != BigDecimal.ZERO)
+            ) {
+                data.add(it)
+            }
+        }
+        val sData = TrackSegment.segmentWithRoad(data)
+        // 鏍规嵁姣忎釜鍒嗘鐨凣PS鍧愭爣鍧囧�奸�氳繃楂樺痉API杞崲涓洪珮寰峰潗鏍�
+        val avgGPS = mutableListOf<Pair<Double, Double>>()
+        sData.forEach {
+            val d = it.avg()
+            if (d.longitude != null && d.latitude != null) {
+                avgGPS.add(d.longitude!!.toDouble() to d.latitude!!.toDouble())
+            }
+        }
+        val gdGPS = AMapService.coordinateConvert(avgGPS)
+        // 閫氳繃楂樺痉API鏌ヨ鍧愭爣瀵瑰簲鐨勮矾娈�
+        val segmentInfoList = mutableListOf<SegmentInfo>()
+        gdGPS.forEachIndexed { i, pair ->
+            val address = AMapService.reGeo(pair)
+            segmentInfoList.add(SegmentInfo().apply {
+                missionCode = mission.missionCode
+                deviceCode = mission.deviceCode
+                startTime = sData[i][0].dataTime
+                endTime = sData[i].last().dataTime
+                provinceName = address.province
+                cityCode = address.citycode
+                districtCode = address.adcode
+                districtName = address.district
+                townCode = address.towncode
+                towmName = address.township
+                street = address.street
+            })
+        }
+        // 缁撴灉鍏ュ簱
+        segmentInfoRep.insert(segmentInfoList)
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/TrackSegment.kt b/src/main/kotlin/com/flightfeather/uav/common/location/TrackSegment.kt
similarity index 60%
rename from src/main/kotlin/com/flightfeather/uav/biz/dataprocess/TrackSegment.kt
rename to src/main/kotlin/com/flightfeather/uav/common/location/TrackSegment.kt
index abd56ec..2b0ed10 100644
--- a/src/main/kotlin/com/flightfeather/uav/biz/dataprocess/TrackSegment.kt
+++ b/src/main/kotlin/com/flightfeather/uav/common/location/TrackSegment.kt
@@ -1,9 +1,11 @@
-package com.flightfeather.uav.biz.dataprocess
+package com.flightfeather.uav.common.location
 
-import com.flightfeather.uav.common.location.CoordinateUtil
 import com.flightfeather.uav.domain.entity.BaseRealTimeData
 import java.math.BigDecimal
 import kotlin.math.abs
+import kotlin.math.atan
+import kotlin.math.cos
+import kotlin.math.sin
 
 /**
  * 璧拌埅杞ㄨ抗鍒嗗壊鍒嗙被
@@ -13,10 +15,10 @@
 object TrackSegment {
 
     // 鍧愭爣鐐归棿鏈�灏忚窛绂伙紝鍗曚綅绫�
-    private const val MIN_DISTANCE = 10
+    private const val MIN_DISTANCE = 6
 
     // 涓ゆ潯鐩寸嚎澶硅涓�90搴︽椂锛岃涓哄瀭鐩淬�傚疄闄呮儏鍐典腑锛岃搴﹀厑璁告湁涓�瀹氬亸宸紝鍏佽鍋忓樊瑙掑害
-    private const val VERTICAL_OFFSET_DEG = 22.5
+    private const val VERTICAL_OFFSET_DEG = 45
 
     /**
      * 鎸夌収閬撹矾瀵硅蛋鑸建杩硅繘琛屽垎鍓�
@@ -34,13 +36,13 @@
         val closeList = mutableListOf<BaseRealTimeData>()
         records.add(mutableListOf())
         data.forEachIndexed { i, d ->
-            if (records.size == 33) {
+            if (records.size == 23) {
                 println(records.size)
             }
             var isSame = false
             if (i > 0) {
                 // 鍓嶄竴涓湁鏁堢洃娴嬬偣
-                val lastData = data[i - 1]
+                var lastData = data[i - 1]
                 // 纭繚涓ょ偣鍧愭爣鍚堟硶
                 if ((lastData.longitude != null && lastData.longitude != BigDecimal.ZERO)
                     && (lastData.latitude != null && lastData.latitude != BigDecimal.ZERO)
@@ -57,6 +59,7 @@
                         // 濡傛灉宸茬粡鏈夎窛绂昏繃杩戠殑鐐归泦鍚堬紝鍒欒繕闇�瑕佸拰绗竴涓偣杩涜璺濈鍒ゆ柇锛�
                         // 瑙e喅褰撹溅杈嗚椹堕�熷害杩囦綆鏃讹紝杩炵画鐐圭殑璺濈閮借繃杩戝鑷撮兘鍒ゅ畾涓哄悓涓�鐐圭殑闂
                         val firstCloseData = closeList[0]
+//                        lastData = closeList.toList().avg()
                         distance = CoordinateUtil.calculateDistance(
                             firstCloseData.longitude!!.toDouble(), firstCloseData.latitude!!.toDouble(),
                             d.longitude!!.toDouble(), d.latitude!!.toDouble())
@@ -69,27 +72,43 @@
                         )
                         isSame = if (lastDegList.isNotEmpty()) {
                             var bool = true
-                            // 鍑虹幇瑙掑害鎺ヨ繎鍨傜洿鐘舵�佺殑娆℃暟
-                            var unSameCount = 0
-                            // 姣旇緝褰撳墠鏂逛綅瑙掑拰涓婁竴缁勬瘡涓柟浣嶈鐨勫樊鍊兼槸鍚﹂兘澶勪簬鑼冨洿鍐�
-                            for (lastDeg in lastDegList) {
-                                val diffDeg = abs(deg - lastDeg)
-                                if (diffDeg in (90.0 - VERTICAL_OFFSET_DEG)..(90.0 + VERTICAL_OFFSET_DEG)
-                                    || diffDeg in (270.0 - VERTICAL_OFFSET_DEG)..(270.0 + VERTICAL_OFFSET_DEG)
-                                ) {
-                                    unSameCount++
-                                }
+
+
+//                            // 鍑虹幇瑙掑害鎺ヨ繎鍨傜洿鐘舵�佺殑娆℃暟
+//                            var unSameCount = 0
+//                            // 姣旇緝褰撳墠鏂逛綅瑙掑拰涓婁竴缁勬瘡涓柟浣嶈鐨勫樊鍊兼槸鍚﹂兘澶勪簬鑼冨洿鍐�
+//                            for (lastDeg in lastDegList) {
+//                                val diffDeg = abs(deg - lastDeg)
+//                                if (diffDeg in (90.0 - VERTICAL_OFFSET_DEG)..(90.0 + VERTICAL_OFFSET_DEG)
+//                                    || diffDeg in (270.0 - VERTICAL_OFFSET_DEG)..(270.0 + VERTICAL_OFFSET_DEG)
+//                                ) {
+//                                    unSameCount++
+//                                }
+//                            }
+//                            // 褰撴帴杩戝瀭鐩寸殑瑙掑害瓒呰繃涓婁竴缁勫钩琛岃搴︾殑涓�鍗婃椂锛岃涓轰粠璇ョ偣杞ㄨ抗杞集锛堟秷闄や釜鍒潗鏍囩偣鐢变簬瀹氫綅璇樊瀵艰嚧鐨勯敊璇奖鍝嶏級
+//                            bool = unSameCount < (lastDegList.size / 3 + 1)
+
+                            val avgDeg = avgDegree(lastDegList)
+                            val diffDeg = abs(deg - avgDeg)
+                            if (diffDeg in (90.0 - VERTICAL_OFFSET_DEG)..(90.0 + VERTICAL_OFFSET_DEG)
+                                || diffDeg in (270.0 - VERTICAL_OFFSET_DEG)..(270.0 + VERTICAL_OFFSET_DEG)
+                            ) {
+                                bool = false
                             }
-                            // 褰撴帴杩戝瀭鐩寸殑瑙掑害瓒呰繃涓婁竴缁勫钩琛岃搴︾殑涓�鍗婃椂锛岃涓轰粠璇ョ偣杞ㄨ抗杞集锛堟秷闄や釜鍒潗鏍囩偣鐢变簬瀹氫綅璇樊瀵艰嚧鐨勯敊璇奖鍝嶏級
-                            bool = unSameCount < (lastDegList.size / 3 + 1)
+
                             // 褰撳嚭鐜拌浆寮偣鏃讹紝娓呯┖鍘嗗彶瑙掑害锛屽苟涓旇垗寮冭浆寮偣鐩稿浜庡墠涓�涓偣鐨勮搴︼紙瑙e喅涓�绉嶆瀬绔儏鍐碉紝褰撹繛缁嚭鐜拌浆寮偣鏃讹紝褰撳墠鍧愭爣鐐逛細琚崟鐙垎鍓蹭负涓�娈碉級
-                            if (!bool) lastDegList.clear()
+                            if (!bool) {
+                                lastDegList.clear()
+                            } else {
+                                lastDegList.add(deg)
+                            }
                             bool
                         } else {
                             // 褰撳潗鏍囩偣褰㈡垚鏈夋晥璺緞鏃讹紝璁板綍涓轰笂涓�涓潗鏍囩偣
                             lastDegList.add(deg)
                             true
                         }
+                        closeList.clear()
                     } else {
                         closeList.add(d)
                         isSame = true
@@ -110,4 +129,40 @@
 
         return records
     }
+
+    /**
+     * 姹傝浆鍚戣搴︾殑鍧囧��
+     */
+    private fun avgDegree(degList: List<Double>): Double {
+        if (degList.isEmpty()) return .0
+        //閲囩敤鍗曚綅鐭㈤噺娉曟眰鍙栧潎鍊�
+        var u = .0//涓滆タ鏂逛綅鍒嗛噺鎬诲拰
+        var v = .0//鍗楀寳鏂逛綅鍒嗛噺鎬诲拰
+        var c = 0//鏁版嵁璁℃暟
+
+        degList.forEach {
+            val r = Math.toRadians(it)
+            u += sin(r)
+            v += cos(r)
+            c++
+        }
+
+        val avgU = u / c
+        val avgV = v / c
+        var a = atan(avgU / avgV)
+        a = Math.toDegrees(a)
+        /**
+         * avgU>0;avgV>0: 鐪熷疄瑙掑害澶勪簬绗竴璞¢檺锛屼慨姝e�间负+0掳
+         * avgU>0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗簩璞¢檺锛屼慨姝e�间负+180掳
+         * avgU<0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗笁璞¢檺锛屼慨姝e�间负+180掳
+         * avgU<0;avgV>0: 鐪熷疄瑙掑害澶勪簬绗洓璞¢檺锛屼慨姝e�间负+360掳
+         */
+        a += if (avgV > 0) {
+            if (avgU > 0) 0 else 360
+        } else {
+            180
+        }
+
+        return a
+    }
 }
\ 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
index f4aa432..a9c5497 100644
--- a/src/main/kotlin/com/flightfeather/uav/common/net/AMapService.kt
+++ b/src/main/kotlin/com/flightfeather/uav/common/net/AMapService.kt
@@ -1,19 +1,106 @@
 package com.flightfeather.uav.common.net
 
+import com.flightfeather.uav.common.exception.BizException
+import com.google.gson.Gson
+import com.google.gson.JsonElement
+import com.google.gson.JsonObject
+import com.google.gson.JsonParser
+import java.nio.charset.Charset
+
 /**
  * 楂樺痉鍦板浘Web鏈嶅姟API
  */
 object AMapService {
 
+    private const val TAG = "AMapService"
+    private const val KEY = "520c5e5cf44c7793104e500cbf0ed711"
+
     private val httpMethod = HttpMethod("restapi.amap.com", 443, true)
-    private val KEY = ""
+
+    data class AMapAddress(
+        val country: String,
+        val province: String,
+        val city: String,
+        val citycode: String,
+        val district: String,
+        val adcode: String,
+        val township: String,
+        val towncode: String,
+        val street: String,
+    )
 
     /**
      * 鍦扮悊閫嗙紪鐮�
+     * @param location 鍧愭爣鐐�
+     * @return 鎵�鍦ㄨ閬�
      */
-    fun reGeo(location:List<Pair<Double, Double>>) {
-        httpMethod.get("v3/geocode/regeo", listOf(
-
+    fun reGeo(location:Pair<Double, Double>):AMapAddress {
+        val res = httpMethod.get("/v3/geocode/regeo", listOf(
+            "key" to KEY,
+            "location" to "${location.first},${location.second}"
         ))
+        val obj = handleRes(res)
+        try {
+            val a = obj["regeocode"].asJsonObject["addressComponent"].asJsonObject
+            return AMapAddress(
+                a["country"].asString,
+                a["province"].asString,
+                "",
+                a["citycode"].asString,
+                a["district"].asString,
+                a["adcode"].asString,
+                a["township"].asString,
+                a["towncode"].asString,
+                a["streetNumber"].asJsonObject["street"].asString,
+            )
+        } catch (e: Exception) {
+            throw BizException("楂樺痉API鍧愭爣杞崲閿欒锛�${e.message}")
+        }
+    }
+
+    /**
+     * 鍧愭爣杞崲
+     * @param locations 鍘熷鍧愭爣
+     * @param coordsys 鍘熷潗鏍囩郴锛屽彲閫夊�硷細gps;mapbar;baidu;autonavi(涓嶈繘琛岃浆鎹�)
+     */
+    fun coordinateConvert(locations: List<Pair<Double, Double>>, coordsys:String="gps"): List<Pair<Double, Double>> {
+        val res = httpMethod.get("/v3/assistant/coordinate/convert", listOf(
+            "key" to KEY,
+            "locations" to locations.joinToString("|") { "${it.first},${it.second}" },
+            "coordsys" to coordsys
+        ))
+        val obj = handleRes(res)
+        try {
+            return obj["locations"].asString.split(";").map {
+                val l = it.split(",")
+                l[0].toDouble() to l[1].toDouble()
+            }
+        } catch (e: Exception) {
+            throw BizException("楂樺痉API鍧愭爣杞崲閿欒锛�${e.message}")
+        }
+    }
+
+    private fun handleRes(res: HttpMethod.MyResponse):JsonObject {
+        if (res.success) {
+//            val str = if (res.m.responseCharSet == "utf-8") {
+//                res.m.responseBodyAsString
+//            } else {
+//                String(res.m.responseBody, Charset.forName("utf-8"))
+//            }
+            val str = res.m.responseBodyAsString
+            val json = JsonParser.parseString(str)
+            return resCheck(json)
+        } else {
+            throw BizException("楂樺痉API缃戣矾閾炬帴閿欒锛岀姸鎬佺爜锛�${res.m.statusCode}")
+        }
+    }
+
+    private fun resCheck(json: JsonElement): JsonObject {
+        if (!json.isJsonObject) throw BizException("楂樺痉API澶辫触锛岃繑鍥炲�间笉鏄竴涓猳bject")
+
+        val jo = json.asJsonObject
+        if (jo["status"].asInt != 1) throw BizException("楂樺痉API澶辫触锛岄敊璇�${jo["info"]}")
+
+        return jo
     }
 }
\ 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
index 350f640..7593aba 100644
--- a/src/main/kotlin/com/flightfeather/uav/common/net/HttpMethod.kt
+++ b/src/main/kotlin/com/flightfeather/uav/common/net/HttpMethod.kt
@@ -18,8 +18,8 @@
     private val logger = LoggerFactory.getLogger(HttpMethod::class.java)
 
     data class MyResponse(
-            val success: Boolean,
-            val m: HttpMethodBase
+        val success: Boolean,
+        val m: HttpMethodBase,
     )
 
     object Head {
diff --git a/src/main/kotlin/com/flightfeather/uav/domain/entity/SegmentInfo.java b/src/main/kotlin/com/flightfeather/uav/domain/entity/SegmentInfo.java
new file mode 100644
index 0000000..a7a221c
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/domain/entity/SegmentInfo.java
@@ -0,0 +1,244 @@
+package com.flightfeather.uav.domain.entity;
+
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "segment_info")
+public class SegmentInfo {
+    @Id
+    private Integer id;
+
+    @Column(name = "mission_code")
+    private String missionCode;
+
+    @Column(name = "device_code")
+    private String deviceCode;
+
+    @Column(name = "start_time")
+    private Date startTime;
+
+    @Column(name = "end_time")
+    private Date endTime;
+
+    @Column(name = "district_code")
+    private String districtCode;
+
+    @Column(name = "district_name")
+    private String districtName;
+
+    @Column(name = "town_code")
+    private String townCode;
+
+    @Column(name = "towm_name")
+    private String towmName;
+
+    @Column(name = "province_code")
+    private String provinceCode;
+
+    @Column(name = "province_name")
+    private String provinceName;
+
+    @Column(name = "city_code")
+    private String cityCode;
+
+    @Column(name = "city_name")
+    private String cityName;
+
+    private String street;
+
+    /**
+     * @return id
+     */
+    public Integer getId() {
+        return id;
+    }
+
+    /**
+     * @param id
+     */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+     * @return mission_code
+     */
+    public String getMissionCode() {
+        return missionCode;
+    }
+
+    /**
+     * @param missionCode
+     */
+    public void setMissionCode(String missionCode) {
+        this.missionCode = missionCode == null ? null : missionCode.trim();
+    }
+
+    /**
+     * @return device_code
+     */
+    public String getDeviceCode() {
+        return deviceCode;
+    }
+
+    /**
+     * @param deviceCode
+     */
+    public void setDeviceCode(String deviceCode) {
+        this.deviceCode = deviceCode == null ? null : deviceCode.trim();
+    }
+
+    /**
+     * @return start_time
+     */
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    /**
+     * @param startTime
+     */
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    /**
+     * @return end_time
+     */
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    /**
+     * @param endTime
+     */
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    /**
+     * @return district_code
+     */
+    public String getDistrictCode() {
+        return districtCode;
+    }
+
+    /**
+     * @param districtCode
+     */
+    public void setDistrictCode(String districtCode) {
+        this.districtCode = districtCode == null ? null : districtCode.trim();
+    }
+
+    /**
+     * @return district_name
+     */
+    public String getDistrictName() {
+        return districtName;
+    }
+
+    /**
+     * @param districtName
+     */
+    public void setDistrictName(String districtName) {
+        this.districtName = districtName == null ? null : districtName.trim();
+    }
+
+    /**
+     * @return town_code
+     */
+    public String getTownCode() {
+        return townCode;
+    }
+
+    /**
+     * @param townCode
+     */
+    public void setTownCode(String townCode) {
+        this.townCode = townCode == null ? null : townCode.trim();
+    }
+
+    /**
+     * @return towm_name
+     */
+    public String getTowmName() {
+        return towmName;
+    }
+
+    /**
+     * @param towmName
+     */
+    public void setTowmName(String towmName) {
+        this.towmName = towmName == null ? null : towmName.trim();
+    }
+
+    /**
+     * @return province_code
+     */
+    public String getProvinceCode() {
+        return provinceCode;
+    }
+
+    /**
+     * @param provinceCode
+     */
+    public void setProvinceCode(String provinceCode) {
+        this.provinceCode = provinceCode == null ? null : provinceCode.trim();
+    }
+
+    /**
+     * @return province_name
+     */
+    public String getProvinceName() {
+        return provinceName;
+    }
+
+    /**
+     * @param provinceName
+     */
+    public void setProvinceName(String provinceName) {
+        this.provinceName = provinceName == null ? null : provinceName.trim();
+    }
+
+    /**
+     * @return city_code
+     */
+    public String getCityCode() {
+        return cityCode;
+    }
+
+    /**
+     * @param cityCode
+     */
+    public void setCityCode(String cityCode) {
+        this.cityCode = cityCode == null ? null : cityCode.trim();
+    }
+
+    /**
+     * @return city_name
+     */
+    public String getCityName() {
+        return cityName;
+    }
+
+    /**
+     * @param cityName
+     */
+    public void setCityName(String cityName) {
+        this.cityName = cityName == null ? null : cityName.trim();
+    }
+
+    /**
+     * @return street
+     */
+    public String getStreet() {
+        return street;
+    }
+
+    /**
+     * @param street
+     */
+    public void setStreet(String street) {
+        this.street = street == null ? null : street.trim();
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/domain/mapper/SegmentInfoMapper.java b/src/main/kotlin/com/flightfeather/uav/domain/mapper/SegmentInfoMapper.java
new file mode 100644
index 0000000..b472372
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/domain/mapper/SegmentInfoMapper.java
@@ -0,0 +1,9 @@
+package com.flightfeather.uav.domain.mapper;
+
+import com.flightfeather.uav.domain.MyMapper;
+import com.flightfeather.uav.domain.entity.SegmentInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SegmentInfoMapper extends MyMapper<SegmentInfo> {
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/flightfeather/uav/domain/repository/SegmentInfoRep.kt b/src/main/kotlin/com/flightfeather/uav/domain/repository/SegmentInfoRep.kt
new file mode 100644
index 0000000..e508d45
--- /dev/null
+++ b/src/main/kotlin/com/flightfeather/uav/domain/repository/SegmentInfoRep.kt
@@ -0,0 +1,18 @@
+package com.flightfeather.uav.domain.repository
+
+import com.flightfeather.uav.domain.entity.SegmentInfo
+import com.flightfeather.uav.domain.mapper.SegmentInfoMapper
+import org.springframework.stereotype.Repository
+
+/**
+ * 杞ㄨ抗鍒嗛殧鏁版嵁搴撴搷浣�
+ * @date 2024/7/4
+ * @author feiyu02
+ */
+@Repository
+class SegmentInfoRep(private val segmentInfoMapper: SegmentInfoMapper) {
+
+    fun insert(list: List<SegmentInfo>):Int {
+        return segmentInfoMapper.insertList(list)
+    }
+}
\ No newline at end of file
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 ffe64d4..ee7dd04 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
@@ -6,7 +6,7 @@
 import com.flightfeather.uav.common.utils.ExcelUtil
 import com.flightfeather.uav.common.utils.FileExchange
 import com.flightfeather.uav.biz.dataprocess.AverageUtil
-import com.flightfeather.uav.biz.dataprocess.TrackSegment
+import com.flightfeather.uav.common.location.TrackSegment
 import com.flightfeather.uav.domain.entity.*
 import com.flightfeather.uav.domain.mapper.*
 import com.flightfeather.uav.domain.repository.MissionRep
diff --git a/src/main/resources/generator/generatorConfig.xml b/src/main/resources/generator/generatorConfig.xml
index ef5ed18..e292e5a 100644
--- a/src/main/resources/generator/generatorConfig.xml
+++ b/src/main/resources/generator/generatorConfig.xml
@@ -47,7 +47,7 @@
         </javaClientGenerator>
         <!-- 瑕佺敓鎴愮殑琛� tableName鏄暟鎹簱涓殑琛ㄥ悕鎴栬鍥惧悕 domainObjectName鏄疄浣撶被鍚�-->
 <!--        <table tableName="air_real_time_data" domainObjectName="RealTimeData" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
-        <table tableName="mission" domainObjectName="Mission" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
+<!--        <table tableName="mission" domainObjectName="Mission" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
 <!--        <table tableName="el_minutevalue" domainObjectName="ElectricMinuteValue" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
 <!--        <table tableName="el_company_device" domainObjectName="CompanyDevice" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
 <!--        <table tableName="co_complaint" domainObjectName="Complaint" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
@@ -60,5 +60,7 @@
 <!--        <table tableName="real_time_data_grid_min" domainObjectName="RealTimeDataGridMin" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
 <!--        <table tableName="real_time_data_grid_opt" domainObjectName="RealTimeDataGridOpt" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
 <!--        <table tableName="scene_info" domainObjectName="SceneInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
+        <table tableName="segment_info" domainObjectName="SegmentInfo" enableCountByExample="false"
+               enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
     </context>
 </generatorConfiguration>
\ No newline at end of file
diff --git a/src/main/resources/mapper/SegmentInfoMapper.xml b/src/main/resources/mapper/SegmentInfoMapper.xml
new file mode 100644
index 0000000..6509f7c
--- /dev/null
+++ b/src/main/resources/mapper/SegmentInfoMapper.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.flightfeather.uav.domain.mapper.SegmentInfoMapper">
+  <resultMap id="BaseResultMap" type="com.flightfeather.uav.domain.entity.SegmentInfo">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="mission_code" jdbcType="VARCHAR" property="missionCode" />
+    <result column="device_code" jdbcType="VARCHAR" property="deviceCode" />
+    <result column="start_time" jdbcType="TIMESTAMP" property="startTime" />
+    <result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
+    <result column="district_code" jdbcType="VARCHAR" property="districtCode" />
+    <result column="district_name" jdbcType="VARCHAR" property="districtName" />
+    <result column="town_code" jdbcType="VARCHAR" property="townCode" />
+    <result column="towm_name" jdbcType="VARCHAR" property="towmName" />
+    <result column="province_code" jdbcType="VARCHAR" property="provinceCode" />
+    <result column="province_name" jdbcType="VARCHAR" property="provinceName" />
+    <result column="city_code" jdbcType="VARCHAR" property="cityCode" />
+    <result column="city_name" jdbcType="VARCHAR" property="cityName" />
+    <result column="street" jdbcType="VARCHAR" property="street" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    id, mission_code, device_code, start_time, end_time, district_code, district_name, 
+    town_code, towm_name, province_code, province_name, city_code, city_name, street
+  </sql>
+</mapper>
\ No newline at end of file
diff --git a/src/test/kotlin/com/flightfeather/uav/biz/dataprocess/RoadSegmentTest.kt b/src/test/kotlin/com/flightfeather/uav/biz/dataprocess/RoadSegmentTest.kt
new file mode 100644
index 0000000..809c608
--- /dev/null
+++ b/src/test/kotlin/com/flightfeather/uav/biz/dataprocess/RoadSegmentTest.kt
@@ -0,0 +1,28 @@
+package com.flightfeather.uav.biz.dataprocess
+
+import com.flightfeather.uav.common.exception.BizException
+import com.flightfeather.uav.domain.repository.MissionRep
+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
+
+@RunWith(SpringRunner::class)
+@SpringBootTest
+class RoadSegmentTest {
+
+    @Autowired
+    lateinit var roadSegment: RoadSegment
+
+    @Autowired
+    lateinit var missionRep: MissionRep
+
+    @Test
+    fun handle() {
+        val mission = missionRep.findOne("SH-CN-20240514") ?: throw BizException("浠诲姟涓嶅瓨鍦�")
+        roadSegment.handle(mission)
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3