feiyu02
2025-09-02 8c6e742562d0c8647e0ee8deff01a3eb176d677b
2025.9.2
1. 新增走航任务统计功能(待完成)
已修改5个文件
114 ■■■■■ 文件已修改
src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedData.kt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSource.kt 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/domain/repository/SourceTraceRep.kt 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/lightshare/web/DataAnalysisController.kt 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceControllerTest.kt 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedData.kt
@@ -84,7 +84,7 @@
                avgPer = calPer(f.main)
                avgRate = calRate(f.main)
                val s = dataSummary(exceptionData, f.main)
                val s = dataSummary(dataList, f.main)
                avg = s.first
                min = s.second
                max = s.third
src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/model/PollutedSource.kt
@@ -62,13 +62,14 @@
            val closePolygonTmp = pollutedArea.closePolygon!!
            val closeFb = MapUtil.calFourBoundaries(closePolygonTmp)
            val closeSceneList = sceneInfoRep.findByCoordinateRange(closeFb)
            // 2. 再精确判断是否在反向溯源区域多边形内部
            closeSceneList.forEach {
                val point = it!!.longitude.toDouble() to it.latitude.toDouble()
                if (MapUtil.isPointInPolygon(point, closePolygonTmp)) {
                    result.add(it)
                }
            }
            // 去重
            result = result.distinctBy { it.guid }.toMutableList()
            // 根据污染因子的量级,计算主要的污染场景类型,筛选结果
            val mainSceneType = calSceneType(pollutedData)
src/main/kotlin/com/flightfeather/uav/domain/repository/SourceTraceRep.kt
@@ -134,6 +134,7 @@
                .andGreaterThanOrEqualTo("startTime", mission.startTime)
                .andLessThanOrEqualTo("endTime", mission.endTime)
        }).map { it?.id }
        if (idList.isEmpty()) return 0
        sourceTraceMsgMapper.deleteByExample(Example(SourceTraceMsg::class.java).apply {
            createCriteria().andIn("id", idList)
        })
src/main/kotlin/com/flightfeather/uav/lightshare/web/DataAnalysisController.kt
@@ -8,6 +8,8 @@
import io.swagger.annotations.ApiParam
import org.springframework.format.annotation.DateTimeFormat
import org.springframework.web.bind.annotation.*
import java.time.LocalDateTime
import java.time.ZoneId
import java.util.*
/**
@@ -38,55 +40,79 @@
    @PostMapping("/report/missionSummary")
    fun generateMissionSummary(
        @ApiParam("开始时间") @RequestParam
        @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        startTime: Date,
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        startTime: LocalDateTime,
        @ApiParam("结束时间") @RequestParam
        @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        endTime: Date,
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        endTime: LocalDateTime,
        @ApiParam("区域") @RequestBody areaVo: AreaVo,
    ) = resPack { dataAnalysisService.generateMissionSummary(startTime, endTime, areaVo) }
    ) = resPack {
        dataAnalysisService.generateMissionSummary(
            Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),
            Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant()),
            areaVo
        )
    }
    @ApiOperation(value = "生成走航任务清单")
    @PostMapping("/report/missionList")
    fun generateMissionList(
        @ApiParam("开始时间") @RequestParam
        @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        startTime: Date,
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        startTime: LocalDateTime,
        @ApiParam("结束时间") @RequestParam
        @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        endTime: Date,
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        endTime: LocalDateTime,
        @ApiParam("区域") @RequestBody areaVo: AreaVo,
    ) = resPack { dataAnalysisService.generateMissionList(startTime, endTime, areaVo) }
    ) = resPack {
        dataAnalysisService.generateMissionList(
            Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),
            Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant()),
            areaVo
        )
    }
    @ApiOperation(value = "生成走航任务详情")
    @PostMapping("/report/missionDetail")
    fun generateMissionDetail(
        @ApiParam("开始时间") @RequestParam
        @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        startTime: Date,
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        startTime: LocalDateTime,
        @ApiParam("结束时间") @RequestParam
        @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        endTime: Date,
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        endTime: LocalDateTime,
        @ApiParam("区域") @RequestBody areaVo: AreaVo,
    ) = resPack { dataAnalysisService.generateMissionDetail(startTime, endTime, areaVo) }
    ) = resPack {
        dataAnalysisService.generateMissionDetail(
            Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),
            Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant()),
            areaVo
        )
    }
    @ApiOperation(value = "走航典型隐患区域统计")
    @PostMapping("/report/clueByRiskArea")
    fun generateClueByRiskArea(
        @ApiParam("开始时间") @RequestParam
        @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        startTime: Date,
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        startTime: LocalDateTime,
        @ApiParam("结束时间") @RequestParam
        @JsonFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        @DateTimeFormat(pattern = "YYYY-MM-DD HH:mm:ss")
        endTime: Date,
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        endTime: LocalDateTime,
        @ApiParam("区域") @RequestBody areaVo: AreaVo,
    ) = resPack { dataAnalysisService.generateClueByRiskArea(startTime, endTime, areaVo) }
    ) = resPack {
        dataAnalysisService.generateClueByRiskArea(
            Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()),
            Date.from(endTime.atZone(ZoneId.systemDefault()).toInstant()),
            areaVo
        )
    }
}
src/test/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceControllerTest.kt
@@ -38,7 +38,7 @@
    @Test
    fun autoSourceTrace() {
        val sourceTraceController = SourceTraceController(sceneInfoRep, sourceTraceRep, false)
        val sourceTraceController = SourceTraceController(sceneInfoRep, sourceTraceRep, true)
//        val mCode = listOf(
//            "SH-CN-20241227", "SH-CN-20241127", "SH-CN-20240906", "SH-CN-20240830(05)",
//            "SH-CN-20240830(04)", "SH-CN-20240823",
@@ -108,16 +108,20 @@
    @Test
    fun deleteSourceTrace() {
        val mCode = listOf(
            "SH-CN-20241227", "SH-CN-20241127", "SH-CN-20240906", "SH-CN-20240830(05)",
            "SH-CN-20240830(04)", "SH-CN-20240823",
            "SH-CN-20240723(02)",
//            "SH-CN-20250723(01)"
        )
        mCode.forEach { c ->
            missionRep.findOne(c)?.let {
                sourceTraceRep.delete(it)
            }
//        val mCode = listOf(
//            "SH-CN-20241227", "SH-CN-20241127", "SH-CN-20240906", "SH-CN-20240830(05)",
//            "SH-CN-20240830(04)", "SH-CN-20240823",
//            "SH-CN-20240723(02)",
////            "SH-CN-20250723(01)"
//        )
        val startTime = LocalDateTime.of(2025, 7, 1, 0, 0, 0).atZone(ZoneId.systemDefault()).toInstant()
        val endTime = LocalDateTime.of(2025, 9, 30, 23, 59, 59).atZone(ZoneId.systemDefault()).toInstant()
        val missions = missionMapper.selectByExample(Example(Mission::class.java).apply {
            createCriteria().andBetween("startTime", startTime, endTime)
        })
        missions.forEach { m ->
            m ?: return@forEach
            sourceTraceRep.delete(m)
        }
    }