From dac47617b37ccfb834cd73ce0ee725e1101de214 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期四, 14 八月 2025 17:25:51 +0800
Subject: [PATCH] 2025.8.14 1. 动态溯源模块添加滑动平均异常计算(调试中)

---
 src/main/kotlin/com/flightfeather/uav/domain/repository/SourceTraceRep.kt |   55 ++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 42 insertions(+), 13 deletions(-)

diff --git a/src/main/kotlin/com/flightfeather/uav/domain/repository/SourceTraceRep.kt b/src/main/kotlin/com/flightfeather/uav/domain/repository/SourceTraceRep.kt
index b4f945a..b8c4c4c 100644
--- a/src/main/kotlin/com/flightfeather/uav/domain/repository/SourceTraceRep.kt
+++ b/src/main/kotlin/com/flightfeather/uav/domain/repository/SourceTraceRep.kt
@@ -6,10 +6,14 @@
 import com.flightfeather.uav.biz.sourcetrace.model.PollutedClue
 import com.flightfeather.uav.biz.sourcetrace.model.PollutedSummary
 import com.flightfeather.uav.common.utils.GsonUtils
+import com.flightfeather.uav.domain.entity.Mission
 import com.flightfeather.uav.domain.entity.SourceTraceMsg
+import com.flightfeather.uav.domain.entity.SourceTraceMsgBlob
+import com.flightfeather.uav.domain.mapper.SourceTraceMsgBlobMapper
 import com.flightfeather.uav.domain.mapper.SourceTraceMsgMapper
 import com.flightfeather.uav.socket.sender.MsgType
 import org.springframework.stereotype.Repository
+import org.springframework.transaction.annotation.Transactional
 import tk.mybatis.mapper.entity.Example
 import java.util.*
 
@@ -19,11 +23,22 @@
  * @author feiyu02
  */
 @Repository
-class SourceTraceRep(private val sourceTraceMsgMapper: SourceTraceMsgMapper) {
+class SourceTraceRep(
+    private val sourceTraceMsgMapper: SourceTraceMsgMapper,
+    private val sourceTraceMsgBlobMapper: SourceTraceMsgBlobMapper,
+) {
+
+    private fun insertBlob(stm: SourceTraceMsg, json: String) {
+        sourceTraceMsgBlobMapper.insert(SourceTraceMsgBlob().apply {
+            msgId = stm.id
+            content = json
+        })
+    }
 
     /**
      * 鎻掑叆婧簮淇℃伅鍜屾彁閱掍俊鎭�
      */
+    @Transactional
     fun insert(msgType: MsgType, obj: PollutedClue): Int {
         val stm = SourceTraceMsg().apply {
             deviceCode = obj.deviceCode
@@ -32,11 +47,12 @@
             startTime = obj.pollutedData?.startTime
             endTime = obj.pollutedData?.endTime
             this.msgType = msgType.value
-            content = GsonUtils.gson.toJson(obj)
             createTime = Date()
         }
         return if (fetchOneExist(stm) == null) {
-            sourceTraceMsgMapper.insert(stm)
+            val c = sourceTraceMsgMapper.insert(stm)
+            insertBlob(stm, GsonUtils.gson.toJson(obj))
+            c
         } else {
             0
         }
@@ -53,17 +69,19 @@
     /**
      * 鎻掑叆绾跨储淇℃伅
      */
+    @Transactional
     fun insert(res: AnalysisResult): Int {
         val stm = SourceTraceMsg().apply {
             deviceCode = res.deviceCode
             startTime = res.time
             endTime = res.time
             this.msgType = MsgType.AnaResult.value
-            content = GsonUtils.gson.toJson(res)
             createTime = Date()
         }
         return if (fetchOneExist(stm) == null) {
-            sourceTraceMsgMapper.insert(stm)
+            val c = sourceTraceMsgMapper.insert(stm)
+            insertBlob(stm, GsonUtils.gson.toJson(res))
+            c
         } else {
             0
         }
@@ -82,25 +100,36 @@
     }
 
     fun fetchList(deviceCode: String, startTime: Date, endTime: Date): List<BaseExceptionResult?> {
-        return sourceTraceMsgMapper.selectByExample(Example(SourceTraceMsg::class.java).apply {
-            createCriteria().andEqualTo("deviceCode", deviceCode)
-                .andGreaterThanOrEqualTo("startTime", startTime)
-                .andLessThanOrEqualTo("endTime", endTime)
-            orderBy("id").desc()
-        }).map { stm ->
+        return sourceTraceMsgBlobMapper.selectWithBlob(deviceCode, startTime, endTime)
+            .map { stm ->
             when (stm?.msgType) {
                 MsgType.PolClue.value,
                 MsgType.DataChange.value,
                     -> {
-                    GsonUtils.gson.fromJson(stm.content, PollutedClue::class.java)
+                    GsonUtils.gson.fromJson(stm.blobContent, PollutedClue::class.java)
                 }
 
                 MsgType.AnaResult.value -> {
-                    GsonUtils.gson.fromJson(stm.content, AnalysisResult::class.java)
+                    GsonUtils.gson.fromJson(stm.blobContent, AnalysisResult::class.java)
                 }
 
                 else -> null
             }
         }
     }
+
+    @Transactional
+    fun delete(mission: Mission): Int {
+        val idList = sourceTraceMsgMapper.selectByExample(Example(SourceTraceMsg::class.java).apply {
+            createCriteria().andEqualTo("deviceCode", mission.deviceCode)
+                .andGreaterThanOrEqualTo("startTime", mission.startTime)
+                .andLessThanOrEqualTo("endTime", mission.endTime)
+        }).map { it?.id }
+        sourceTraceMsgMapper.deleteByExample(Example(SourceTraceMsg::class.java).apply {
+            createCriteria().andIn("id", idList)
+        })
+        return sourceTraceMsgBlobMapper.deleteByExample(Example(SourceTraceMsgBlob::class.java).apply {
+            createCriteria().andIn("msgId", idList)
+        })
+    }
 }
\ No newline at end of file

--
Gitblit v1.9.3