From db447bb757b51f8d03e62d6ae4f183b4608723ef Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期五, 07 三月 2025 17:10:43 +0800
Subject: [PATCH] 卫星遥测系统相关接口新增及调整

---
 src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImpl.kt |  132 ++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 128 insertions(+), 4 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImpl.kt
index 1d0acf1..248b091 100644
--- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImpl.kt
+++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/SatelliteDataCalculateServiceImpl.kt
@@ -3,10 +3,20 @@
 import com.flightfeather.uav.biz.satellite.SatelliteGridManage
 import com.flightfeather.uav.common.exception.BizException
 import com.flightfeather.uav.domain.entity.GridCell
+import com.flightfeather.uav.domain.entity.GridData
+import com.flightfeather.uav.domain.entity.GridDataDetail
 import com.flightfeather.uav.domain.entity.GridGroup
+import com.flightfeather.uav.domain.repository.MissionRep
+import com.flightfeather.uav.domain.repository.RealTimeDataRep
 import com.flightfeather.uav.domain.repository.SatelliteGridRep
+import com.flightfeather.uav.lightshare.eunm.GridType
+import com.flightfeather.uav.lightshare.eunm.SatelliteDataType
 import com.flightfeather.uav.lightshare.service.SatelliteDataCalculateService
+import org.springframework.beans.BeanUtils
 import org.springframework.stereotype.Service
+import org.springframework.transaction.annotation.Transactional
+import java.util.Date
+import kotlin.math.round
 
 /**
  * 鍗槦缃戞牸鍧愭爣鍙婄洃娴嬫暟鎹簩娆¤绠�
@@ -14,7 +24,11 @@
  * @author feiyu02
  */
 @Service
-class SatelliteDataCalculateServiceImpl(private val satelliteGridRep: SatelliteGridRep) : SatelliteDataCalculateService {
+class SatelliteDataCalculateServiceImpl(
+    private val satelliteGridRep: SatelliteGridRep,
+    private val realTimeDataRep: RealTimeDataRep,
+    private val missionRep: MissionRep,
+) : SatelliteDataCalculateService {
 
 
     override fun calGridVertex(groupId: Int): List<GridCell?> {
@@ -47,13 +61,123 @@
     }
 
     override fun splitGrid(groupId: Int, scale: Int): List<GridCell?> {
+        // 妫�鏌ヨ缃戞牸灞炴�ф槸鍚﹀悎瑙�
+        val gridGroup =
+            satelliteGridRep.fetchGridGroup(groupId) ?: throw BizException("璇ョ綉鏍肩粍涓嶅瓨鍦紝鏃犳硶杩涜缃戞牸缁嗗垎")
+        if (gridGroup.length == null) throw BizException("璇ョ綉鏍肩粍娌℃湁璁惧畾缃戞牸杈归暱锛屾棤娉曡繘琛岀綉鏍肩粏鍒�")
+
         // 妫�鏌ヨ缃戞牸涓嬭绉嶇被鐨勭粏鍒嗙綉鏍兼槸鍚﹀瓨鍦紝鑻ヤ笉瀛樺湪锛屽垯鏂板缓
-        satelliteGridRep.fetchGridGroup(groupId)
+        val searchGridGroup = GridGroup().apply {
+            type = GridType.Sub.name.lowercase()
+            fatherGroupId = gridGroup.id
+            length = round(gridGroup.length / scale)
+        }
+        val subGridGroupList = satelliteGridRep.fetchGridGroup(searchGridGroup)
+        // 鑻ョ粏鍒嗙綉鏍艰褰曡秴杩�1涓紝璇存槑涓氬姟閫昏緫瀛樺湪闂锛岀浉鍚岃竟闀跨殑缁嗗垎缃戞牸搴旇鍙湁1涓�
+        if (subGridGroupList.size > 1) {
+            throw BizException("璇ョ綉鏍肩粍涓�${searchGridGroup.length}绫宠竟闀跨殑缃戞牸璁板綍瓒呰繃1涓紝鏃犳硶鍐嶈繘琛岀綉鏍肩粏鍒嗭紝骞朵笖璇锋鏌ョ敓鎴愰�昏緫鏄惁闂")
+        }
+        // 鑻ョ粏鍒嗙綉鏍艰褰曟湁涓斿彧鏈�1涓紝鍒欐棤闇�鍐嶆缁嗗垎锛岀洿鎺ヨ繑鍥炲凡鏈夌粨鏋�
+        else if (subGridGroupList.size == 1) {
+            val g = subGridGroupList.first()
+                ?: throw BizException("璇ョ綉鏍肩粍涓嬬殑缁嗗垎缃戞牸璁板綍宸叉崯鍧忥紝鏃犳硶浣跨敤锛岃妫�鏌ユ暟鎹簱璁板綍")
+            return satelliteGridRep.fetchGridCell(g.id)
+        }
+        // 褰撴病鏈夎褰曟椂锛屾墽琛岀敓鎴愰�昏緫
+
+        // 鐢熸垚鏂扮殑缁嗗垎缃戞牸缁勮褰�
+        val newGridGroup = GridGroup()
+        BeanUtils.copyProperties(gridGroup, newGridGroup)
+        newGridGroup.apply {
+            id = null
+            name += "${searchGridGroup.length.toInt()}绫崇粏鍒�"
+            createTime = Date()
+            length = searchGridGroup.length
+            type = GridType.Sub.name.lowercase()
+            fatherGroupId = groupId
+        }
+        satelliteGridRep.insertGridGroup(newGridGroup)
+
         // 鑾峰彇鍏蜂綋缃戞牸淇℃伅
         val cellList = satelliteGridRep.fetchGridCell(groupId)
         // 鎸夌収缁欏畾鐨勬媶鍒嗙郴鏁拌繘琛屾媶鍒�
-//        val subCellList = SatelliteGridManage.splitGrid(cellList, scale)
+        val subCellList = SatelliteGridManage.splitGrid(cellList, scale, newGridGroup.id)
+        satelliteGridRep.insertGridCell(subCellList)
 
-        return emptyList()
+        return subCellList
+    }
+
+    @Transactional
+    override fun splitData(groupId: Int, dataId:Int): List<GridDataDetail?> {
+        // 妫�鏌ユ槸鍚︽槸缁嗗垎缃戞牸绫诲瀷
+        val gridGroup = satelliteGridRep.fetchGridGroup(groupId) ?: throw BizException("璇ョ綉鏍肩粍涓嶅瓨鍦紝鏃犳硶杩涜缁嗗垎缃戞牸鏁版嵁鏄犲皠")
+        if (gridGroup.type != GridType.Sub.name.lowercase()) throw BizException("璇ョ綉鏍肩粍涓嶆槸缁嗗垎缃戞牸绫诲瀷瀛樺湪锛屾棤娉曡繘琛岀粏鍒嗙綉鏍兼暟鎹槧灏�")
+
+        val subGridCellList = satelliteGridRep.fetchGridCell(groupId)
+        val originGridData = satelliteGridRep.fetchGridData(dataId)
+        val originGridDataDetailList = satelliteGridRep.fetchGridDataDetail(dataId, null, null)
+
+        val subGridData = GridData().apply {
+            this.groupId = groupId
+            dataTime = originGridData?.dataTime
+            type = SatelliteDataType.Sub.value.toByte()
+        }
+        satelliteGridRep.insertGridData(subGridData)
+
+        val subGridDataDetailList =
+            SatelliteGridManage.splitData(subGridCellList, subGridData, originGridDataDetailList)
+
+        satelliteGridRep.insertGridDataDetail(subGridDataDetailList)
+
+        return subGridDataDetailList
+    }
+
+    @Transactional
+    override fun dataFusion(missionCode: String, groupId: Int): List<GridDataDetail?> {
+        // 鏌ヨ璧拌埅浠诲姟鍙婂搴旇蛋鑸洃娴嬫暟鎹�
+        val mission = missionRep.findOne(missionCode) ?: throw BizException("浠诲姟涓嶅瓨鍦�")
+        val data = realTimeDataRep.fetchData(mission)
+
+        val oldGridDataList = satelliteGridRep.fetchGridData(GridData().apply {
+            this.groupId = groupId
+            mixDataId = missionCode
+        })
+
+        if (oldGridDataList.isEmpty()) {
+            // 鍒涘缓铻嶅悎鏁版嵁绱㈠紩瀵硅薄
+            val newGridData = GridData().apply {
+                this.groupId = groupId
+                dataTime = mission.startTime
+                type = SatelliteDataType.Monitor.value.toByte()
+                mixDataId = mission.missionCode
+            }
+            satelliteGridRep.insertGridData(newGridData)
+
+            // 鏌ヨ缃戞牸鍗曞厓鏍间俊鎭�
+            val gridCellList = satelliteGridRep.fetchGridCell(groupId)
+
+            // 灏嗚蛋鑸暟鎹拰鍗槦缃戞牸杩涜铻嶅悎璁$畻
+            val gridDataDetailList = SatelliteGridManage.dataFusion(data, newGridData, gridCellList)
+            satelliteGridRep.insertGridDataDetail(gridDataDetailList)
+
+            return gridDataDetailList
+        } else {
+            val oldGridData = oldGridDataList.first()
+            val oldGridDataDetailList = satelliteGridRep.fetchGridDataDetail(oldGridData?.id, oldGridData?.groupId,
+                null)
+            // 鏌ヨ缃戞牸鍗曞厓鏍间俊鎭�
+            val gridCellList = satelliteGridRep.fetchGridCell(groupId)
+            // 灏嗚蛋鑸暟鎹拰鍗槦缃戞牸杩涜铻嶅悎璁$畻
+            val gridDataDetailList = SatelliteGridManage.dataFusion(data, oldGridData, gridCellList)
+
+            // 灏嗗凡鏈夌殑鏁版嵁id璧嬪�肩粰鏂扮殑铻嶅悎缁撴灉锛屼袱缁勭粨鏋滃潎浠ユ牴鎹甤ellId椤哄簭鎺掑垪锛屾墍浠ョ洿鎺ュ惊鐜祴鍊�
+            gridDataDetailList.forEachIndexed { index, gridDataDetail ->
+                gridDataDetail.id = oldGridDataDetailList[index]?.id
+            }
+
+            satelliteGridRep.updateGridDataDetail(gridDataDetailList)
+
+            return gridDataDetailList
+        }
     }
 }
\ No newline at end of file

--
Gitblit v1.9.3