riku
2025-08-28 3bb4fb15c664d29d179083698fdad35a661b1d7f
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,43 +23,65 @@
 * @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
            factorName = obj.pollutedData?.factorName
            factorName = obj.pollutedData?.toFactorNames()
            exceptionType = obj.pollutedData?.exceptionType
            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
        }
    }
    fun insertList(msgType: MsgType, objList: List<PollutedClue>): Int {
        var res = 0
        objList.forEach {
            res += insert(msgType, it)
        }
        return res
    }
    /**
     * 插入线索信息
     */
    @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
        }
@@ -74,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)
        })
    }
}