From ddaa44400aa478058ffe9349d59904a130b7ce9c Mon Sep 17 00:00:00 2001 From: feiyu02 <risaku@163.com> Date: 星期四, 28 八月 2025 17:33:11 +0800 Subject: [PATCH] 2025.8.28 1. 新增走航任务统计功能(待完成) --- src/main/kotlin/com/flightfeather/uav/biz/mission/MissionUtil.kt | 2 src/main/kotlin/com/flightfeather/uav/lightshare/service/DataAnalysisService.kt | 5 src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/DataAnalysisServiceImpl.kt | 28 ++ src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt | 8 src/test/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceControllerTest.kt | 51 ++-- src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt | 3 src/main/kotlin/com/flightfeather/uav/common/file/Docx4jGenerator.kt | 228 +++++++++++----------- src/test/kotlin/com/flightfeather/uav/biz/report/MissionSummaryTest.kt | 55 +++++ src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt | 33 +++ src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImplTest.kt | 88 +------- pom.xml | 49 ++-- 11 files changed, 312 insertions(+), 238 deletions(-) diff --git a/pom.xml b/pom.xml index 6b67ad9..a0c3395 100644 --- a/pom.xml +++ b/pom.xml @@ -267,30 +267,31 @@ <artifactId>commons-lang3</artifactId> <version>3.17.0</version> </dependency> - <dependency> - <groupId>org.docx4j</groupId> - <artifactId>docx4j-core</artifactId> - <version>11.4.9</version> <!-- 浣跨敤鏈�鏂扮ǔ瀹氱増 --> - </dependency> - <!-- 濡傞渶澶勭悊鍥剧墖/琛ㄦ牸绛夐珮绾у姛鑳斤紝鍙坊鍔� --> - <dependency> - <groupId>org.docx4j</groupId> - <artifactId>docx4j-ImportXHTML</artifactId> - <version>11.4.8</version> - </dependency> - <!-- MockK 鍗曞厓娴嬭瘯搴擄紙鐢ㄤ簬 Kotlin锛� --> - <dependency> - <groupId>io.mockk</groupId> - <artifactId>mockk</artifactId> - <version>1.14.5</version> <!-- 浣跨敤鏈�鏂扮ǔ瀹氱増 --> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter</artifactId> - <version>RELEASE</version> - <scope>test</scope> - </dependency> +<!-- <dependency>--> +<!-- <groupId>org.docx4j</groupId>--> +<!-- <artifactId>docx4j-core</artifactId>--> +<!-- <version>11.4.9</version> <!– 浣跨敤鏈�鏂扮ǔ瀹氱増 –>--> +<!-- </dependency>--> +<!-- <!– 濡傞渶澶勭悊鍥剧墖/琛ㄦ牸绛夐珮绾у姛鑳斤紝鍙坊鍔� –>--> +<!-- <dependency>--> +<!-- <groupId>org.docx4j</groupId>--> +<!-- <artifactId>docx4j-ImportXHTML</artifactId>--> +<!-- <version>11.4.8</version>--> +<!-- </dependency>--> +<!-- <!– MockK 鍗曞厓娴嬭瘯搴擄紙鐢ㄤ簬 Kotlin锛� –>--> +<!-- <dependency>--> +<!-- <groupId>io.mockk</groupId>--> +<!-- <artifactId>mockk</artifactId>--> +<!-- <version>1.14.5</version> <!– 浣跨敤鏈�鏂扮ǔ瀹氱増 –>--> +<!-- <scope>test</scope>--> +<!-- </dependency>--> +<!-- <dependency>--> +<!-- <groupId>org.junit.jupiter</groupId>--> +<!-- <artifactId>junit-jupiter</artifactId>--> +<!-- <version>RELEASE</version>--> +<!-- <scope>test</scope>--> +<!-- </dependency>--> + </dependencies> diff --git a/src/main/kotlin/com/flightfeather/uav/biz/mission/MissionUtil.kt b/src/main/kotlin/com/flightfeather/uav/biz/mission/MissionUtil.kt index 1edaf99..be6523c 100644 --- a/src/main/kotlin/com/flightfeather/uav/biz/mission/MissionUtil.kt +++ b/src/main/kotlin/com/flightfeather/uav/biz/mission/MissionUtil.kt @@ -54,6 +54,6 @@ // 灏哤GS84鍧愭爣杞崲涓篏CJ02鍧愭爣鍚庤繘琛岄�嗗湴鐞嗙紪鐮佽幏鍙栧湴鍧�淇℃伅 val address = AMapService.reGeo(MapUtil.wgs84ToGcj02(pair as Pair<Double, Double>)) // 杩斿洖涔¢晣鍜岃閬撳悕绉扮粍鍚� - return address.township + address.street + return address.township } } diff --git a/src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt b/src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt index fe910c4..26a597a 100644 --- a/src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt +++ b/src/main/kotlin/com/flightfeather/uav/biz/report/MissionInventory.kt @@ -1,9 +1,11 @@ package com.flightfeather.uav.biz.report +import com.flightfeather.uav.biz.sourcetrace.model.PollutedClue import com.flightfeather.uav.domain.entity.Mission import com.flightfeather.uav.domain.entity.SceneInfo import com.flightfeather.uav.lightshare.bean.FactorStatistics import com.flightfeather.uav.socket.eunm.FactorType +import com.flightfeather.uav.socket.sender.MsgType /** * 璧拌埅婧簮娓呭崟 @@ -29,6 +31,37 @@ class MissionDetail : Mission() { var keyScene: List<SceneInfo>? = null var dataStatistics: List<FactorStatistics>? = null + } + /** + * 杈撳嚭璧拌埅娓呭崟 + */ + fun missionList(missionClues: List<Pair<Mission?, List<PollutedClue?>>>): List<MissionInfo> { + + val missionMap = mutableMapOf<String, MissionInfo>() + missionClues.forEach { (mission, clue) -> + mission ?: return@forEach + clue ?: return@forEach + val missionInfo = missionMap[mission.missionCode] ?: MissionInfo().apply { + missionMap[mission.missionCode] = this + } + val abnormalFactors = mutableListOf<FactorType>() + var sceneCount = 0 + clue.forEach { + if (it?.msgType == MsgType.PolClue.value) { + it.pollutedData?.statisticMap?.keys?.forEach { k-> + if (!abnormalFactors.contains(k)) { + abnormalFactors.add(k) + } + } + } + } + // 璁$畻姣忎釜璧拌埅浠诲姟鐨勬墍鏈夊紓甯稿洜瀛� + + // 璁$畻姣忎釜璧拌埅浠诲姟鐨勯瑕佹薄鏌撶墿 + + // 璁$畻姣忎釜璧拌埅浠诲姟鐨勬函婧愬満鏅暟閲� + } + return mutableListOf() } } \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt index d2b696f..eb0f7eb 100644 --- a/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt +++ b/src/main/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceController.kt @@ -45,14 +45,16 @@ .withMain(FactorType.CO) // .withMain(FactorType.H2S) // .withMain(FactorType.SO2) - .withMain(FactorType.O3) +// .withMain(FactorType.O3) .withMain(FactorType.PM25) .withMain(FactorType.PM10) - .withMain(FactorType.VOC) +// .withMain(FactorType.VOC) + .withMain(FactorType.NO) .withCombination( listOf( listOf(FactorType.PM25, FactorType.PM10), - listOf(FactorType.VOC, FactorType.CO), +// listOf(FactorType.VOC, FactorType.CO), + listOf(FactorType.NO, FactorType.NO2), ) ) .create() diff --git a/src/main/kotlin/com/flightfeather/uav/common/file/Docx4jGenerator.kt b/src/main/kotlin/com/flightfeather/uav/common/file/Docx4jGenerator.kt index d33e105..8b14f83 100644 --- a/src/main/kotlin/com/flightfeather/uav/common/file/Docx4jGenerator.kt +++ b/src/main/kotlin/com/flightfeather/uav/common/file/Docx4jGenerator.kt @@ -1,114 +1,114 @@ -package com.flightfeather.uav.common.file - -import freemarker.template.Configuration -import freemarker.template.Template - -import org.docx4j.openpackaging.packages.WordprocessingMLPackage -import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart -import java.io.ByteArrayInputStream -import java.io.ByteArrayOutputStream -import java.io.File -import java.io.OutputStreamWriter -import java.nio.charset.StandardCharsets - -/** - * Word鏂囦欢鐢熸垚鍣紙鍩轰簬Docx4j + FreeMarker锛� - * @date 2025/8/28 09:29 - * @author feiyu - */ -class Docx4jGenerator( - private val templatePath: String, - private val freemarkerConfig: Configuration = defaultFreemarkerConfig() -) { - private var wordMLPackage: WordprocessingMLPackage? = null - private var mainDocumentPart: MainDocumentPart? = null - - /** - * 鍒涘缓Word鏂囨。鍖� - */ - fun loadTemplate(): Docx4jGenerator { - wordMLPackage = WordprocessingMLPackage.createPackage() - mainDocumentPart = wordMLPackage?.mainDocumentPart - - return this - } - - /** - * 浣跨敤FreeMarker濉厖妯℃澘鏁版嵁 - */ - fun fillData(dataModel: Map<String, Any>): Docx4jGenerator { - val template = freemarkerConfig.getTemplate(templatePath.substringAfterLast("/")) - val xmlContent = renderTemplate(template, dataModel) - - mainDocumentPart?.unmarshal(ByteArrayInputStream(xmlContent.toByteArray(StandardCharsets.UTF_8))) - return this - } - - /** - * 娣诲姞鍥剧墖鍒癢ord鏂囨。 - * @param imagePath 鍥剧墖璺緞 - * @param width 瀹藉害(鍍忕礌) - * @param height 楂樺害(鍍忕礌) - * @param paragraphId 娈佃惤ID锛屾寚瀹氬浘鐗囨彃鍏ヤ綅缃� - */ - fun addImage(imagePath: String, width: Int, height: Int, paragraphId: String): Docx4jGenerator { - // 瀹炵幇鍥剧墖娣诲姞閫昏緫 - return this - } - - /** - * 娣诲姞琛ㄦ牸鍒癢ord鏂囨。 - * @param data 琛ㄦ牸鏁版嵁 - * @param paragraphId 娈佃惤ID锛屾寚瀹氳〃鏍兼彃鍏ヤ綅缃� - */ - fun addTable(data: List<List<String>>, paragraphId: String): Docx4jGenerator { - // 瀹炵幇琛ㄦ牸娣诲姞閫昏緫 - return this - } - - /** - * 淇濆瓨鐢熸垚鐨刉ord鏂囦欢 - * @param outputPath 杈撳嚭鏂囦欢璺緞 - */ - fun save(outputPath: String) { - wordMLPackage?.save(File(outputPath)) - } - - /** - * 浣跨敤FreeMarker娓叉煋妯℃澘 - */ - private fun renderTemplate(template: Template, dataModel: Map<String, Any>): String { - val outputStream = ByteArrayOutputStream() - val writer = OutputStreamWriter(outputStream, StandardCharsets.UTF_8) - template.process(dataModel, writer) - writer.flush() - return outputStream.toString(StandardCharsets.UTF_8.name()) - } - - companion object { - /** - * 榛樿FreeMarker閰嶇疆 - */ - fun defaultFreemarkerConfig(): Configuration { - val config = Configuration(Configuration.VERSION_2_3_31) - config.defaultEncoding = "UTF-8" - config.setClassForTemplateLoading(Docx4jGenerator::class.java, "/templates") - return config - } - - /** - * 绠�鍖栬皟鐢ㄧ殑闈欐�佹柟娉� - */ - fun generate( - templatePath: String, - outputPath: String, - dataModel: Map<String, Any>, - config: Configuration = defaultFreemarkerConfig() - ) { - Docx4jGenerator(templatePath, config) - .loadTemplate() - .fillData(dataModel) - .save(outputPath) - } - } -} \ No newline at end of file +//package com.flightfeather.uav.common.file +// +//import freemarker.template.Configuration +//import freemarker.template.Template +// +//import org.docx4j.openpackaging.packages.WordprocessingMLPackage +//import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart +//import java.io.ByteArrayInputStream +//import java.io.ByteArrayOutputStream +//import java.io.File +//import java.io.OutputStreamWriter +//import java.nio.charset.StandardCharsets +// +///** +// * Word鏂囦欢鐢熸垚鍣紙鍩轰簬Docx4j + FreeMarker锛� +// * @date 2025/8/28 09:29 +// * @author feiyu +// */ +//class Docx4jGenerator( +// private val templatePath: String, +// private val freemarkerConfig: Configuration = defaultFreemarkerConfig() +//) { +// private var wordMLPackage: WordprocessingMLPackage? = null +// private var mainDocumentPart: MainDocumentPart? = null +// +// /** +// * 鍒涘缓Word鏂囨。鍖� +// */ +// fun loadTemplate(): Docx4jGenerator { +// wordMLPackage = WordprocessingMLPackage.createPackage() +// mainDocumentPart = wordMLPackage?.mainDocumentPart +// +// return this +// } +// +// /** +// * 浣跨敤FreeMarker濉厖妯℃澘鏁版嵁 +// */ +// fun fillData(dataModel: Map<String, Any>): Docx4jGenerator { +// val template = freemarkerConfig.getTemplate(templatePath.substringAfterLast("/")) +// val xmlContent = renderTemplate(template, dataModel) +// +// mainDocumentPart?.unmarshal(ByteArrayInputStream(xmlContent.toByteArray(StandardCharsets.UTF_8))) +// return this +// } +// +// /** +// * 娣诲姞鍥剧墖鍒癢ord鏂囨。 +// * @param imagePath 鍥剧墖璺緞 +// * @param width 瀹藉害(鍍忕礌) +// * @param height 楂樺害(鍍忕礌) +// * @param paragraphId 娈佃惤ID锛屾寚瀹氬浘鐗囨彃鍏ヤ綅缃� +// */ +// fun addImage(imagePath: String, width: Int, height: Int, paragraphId: String): Docx4jGenerator { +// // 瀹炵幇鍥剧墖娣诲姞閫昏緫 +// return this +// } +// +// /** +// * 娣诲姞琛ㄦ牸鍒癢ord鏂囨。 +// * @param data 琛ㄦ牸鏁版嵁 +// * @param paragraphId 娈佃惤ID锛屾寚瀹氳〃鏍兼彃鍏ヤ綅缃� +// */ +// fun addTable(data: List<List<String>>, paragraphId: String): Docx4jGenerator { +// // 瀹炵幇琛ㄦ牸娣诲姞閫昏緫 +// return this +// } +// +// /** +// * 淇濆瓨鐢熸垚鐨刉ord鏂囦欢 +// * @param outputPath 杈撳嚭鏂囦欢璺緞 +// */ +// fun save(outputPath: String) { +// wordMLPackage?.save(File(outputPath)) +// } +// +// /** +// * 浣跨敤FreeMarker娓叉煋妯℃澘 +// */ +// private fun renderTemplate(template: Template, dataModel: Map<String, Any>): String { +// val outputStream = ByteArrayOutputStream() +// val writer = OutputStreamWriter(outputStream, StandardCharsets.UTF_8) +// template.process(dataModel, writer) +// writer.flush() +// return outputStream.toString(StandardCharsets.UTF_8.name()) +// } +// +// companion object { +// /** +// * 榛樿FreeMarker閰嶇疆 +// */ +// fun defaultFreemarkerConfig(): Configuration { +// val config = Configuration(Configuration.VERSION_2_3_31) +// config.defaultEncoding = "UTF-8" +// config.setClassForTemplateLoading(Docx4jGenerator::class.java, "/templates") +// return config +// } +// +// /** +// * 绠�鍖栬皟鐢ㄧ殑闈欐�佹柟娉� +// */ +// fun generate( +// templatePath: String, +// outputPath: String, +// dataModel: Map<String, Any>, +// config: Configuration = defaultFreemarkerConfig() +// ) { +// Docx4jGenerator(templatePath, config) +// .loadTemplate() +// .fillData(dataModel) +// .save(outputPath) +// } +// } +//} \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt b/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt index dccef45..f33ac6f 100644 --- a/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt +++ b/src/main/kotlin/com/flightfeather/uav/domain/entity/BaseRealTimeData.kt @@ -147,6 +147,9 @@ } fun List<BaseRealTimeData>.avg(): BaseRealTimeData { + if (isEmpty()) { + return BaseRealTimeData() + } //椋庡悜閲囩敤鍗曚綅鐭㈤噺娉曟眰鍙栧潎鍊� var u = .0//涓滆タ鏂逛綅鍒嗛噺鎬诲拰 var v = .0//鍗楀寳鏂逛綅鍒嗛噺鎬诲拰 diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/DataAnalysisService.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/DataAnalysisService.kt index b84e115..61683df 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/DataAnalysisService.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/DataAnalysisService.kt @@ -2,7 +2,10 @@ import com.flightfeather.uav.biz.dataanalysis.BaseExceptionResult import com.flightfeather.uav.biz.dataanalysis.model.ExceptionResult +import com.flightfeather.uav.biz.report.MissionSummary import com.flightfeather.uav.biz.sourcetrace.model.BasePollutedMsg +import com.flightfeather.uav.lightshare.bean.AreaVo +import java.util.* /** * @@ -18,4 +21,6 @@ fun pollutionTrace(missionCode: String): List<ExceptionResult> fun fetchHistory(missionCode: String): String + + fun missionSummary(startTime: Date, endTime: Date, areaVo: AreaVo): MissionSummary.Summary } \ No newline at end of file diff --git a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/DataAnalysisServiceImpl.kt b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/DataAnalysisServiceImpl.kt index f8ad2c7..3982b5c 100644 --- a/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/DataAnalysisServiceImpl.kt +++ b/src/main/kotlin/com/flightfeather/uav/lightshare/service/impl/DataAnalysisServiceImpl.kt @@ -4,17 +4,26 @@ import com.flightfeather.uav.biz.dataanalysis.BaseExceptionResult import com.flightfeather.uav.biz.dataanalysis.ExceptionAnalysisController import com.flightfeather.uav.biz.dataanalysis.model.ExceptionResult +import com.flightfeather.uav.biz.report.MissionSummary import com.flightfeather.uav.biz.sourcetrace.model.BasePollutedMsg +import com.flightfeather.uav.biz.sourcetrace.model.PollutedClue import com.flightfeather.uav.common.exception.BizException import com.flightfeather.uav.common.location.LocationRoadNearby import com.flightfeather.uav.common.utils.GsonUtils +import com.flightfeather.uav.domain.entity.Mission +import com.flightfeather.uav.domain.mapper.MissionMapper import com.flightfeather.uav.domain.repository.MissionRep import com.flightfeather.uav.domain.repository.RealTimeDataRep import com.flightfeather.uav.domain.repository.SegmentInfoRep import com.flightfeather.uav.domain.repository.SourceTraceRep +import com.flightfeather.uav.lightshare.bean.AreaVo import com.flightfeather.uav.lightshare.service.DataAnalysisService import com.flightfeather.uav.socket.eunm.FactorType import org.springframework.stereotype.Service +import tk.mybatis.mapper.entity.Example +import java.time.LocalDateTime +import java.time.ZoneId +import java.util.* /** * @@ -24,6 +33,7 @@ @Service class DataAnalysisServiceImpl( private val missionRep: MissionRep, + private val missionMapper: MissionMapper, private val realTimeDataRep: RealTimeDataRep, private val locationRoadNearby: LocationRoadNearby, private val segmentInfoRep: SegmentInfoRep, @@ -56,4 +66,22 @@ val res = sourceTraceRep.fetchList(mission.deviceCode, mission.startTime, mission.endTime) return GsonUtils.gson.toJson(res) } + + override fun missionSummary(startTime: Date, endTime: Date, areaVo: AreaVo): MissionSummary.Summary { + val clues = mutableListOf<PollutedClue?>() + val missions = missionMapper.selectByExample(Example(Mission::class.java).apply { + createCriteria().andBetween("startTime", startTime, endTime) + .andEqualTo("provinceCode", areaVo.provinceCode) + .andEqualTo("cityCode", areaVo.cityCode) + .andEqualTo("districtCode", areaVo.districtCode) + .andIsNotNull("kilometres") + .andNotEqualTo("kilometres", 0) + }).onEach { + it ?: return@onEach + val clue = sourceTraceRep.fetchList(it.deviceCode, it.startTime, it.endTime).filterIsInstance<PollutedClue?>() + clues.addAll(clue) + } + val summary = MissionSummary().execute(startTime, endTime, missions, clues) + return summary + } } \ No newline at end of file diff --git a/src/test/kotlin/com/flightfeather/uav/biz/report/MissionSummaryTest.kt b/src/test/kotlin/com/flightfeather/uav/biz/report/MissionSummaryTest.kt new file mode 100644 index 0000000..398bd1e --- /dev/null +++ b/src/test/kotlin/com/flightfeather/uav/biz/report/MissionSummaryTest.kt @@ -0,0 +1,55 @@ +package com.flightfeather.uav.biz.report + +import com.flightfeather.uav.biz.sourcetrace.model.PollutedClue +import com.flightfeather.uav.domain.entity.Mission +import com.flightfeather.uav.domain.mapper.MissionMapper +import com.flightfeather.uav.domain.repository.SourceTraceRep +import com.flightfeather.uav.lightshare.bean.AreaVo +import com.flightfeather.uav.lightshare.service.DataAnalysisService +import org.junit.Test +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 +import tk.mybatis.mapper.entity.Example +import java.time.LocalDateTime +import java.time.ZoneId +import java.time.ZoneOffset +import java.util.Date + +@RunWith(SpringRunner::class) +@SpringBootTest +class MissionSummaryTest { + + private val missionSummary: MissionSummary = MissionSummary() + + @Autowired + lateinit var missionMapper: MissionMapper + + @Autowired + lateinit var sourceTraceRep: SourceTraceRep + + @Autowired + lateinit var dataAnalysisService: DataAnalysisService + + @Test + fun testMissionSummary() { + val startTime = Date.from(LocalDateTime.of(2025,7,1,0,0,0).atZone(ZoneId.systemDefault()).toInstant()) + val endTime = Date.from(LocalDateTime.of(2025, 9, 30, 23, 59, 59).atZone(ZoneId.systemDefault()).toInstant()) + val summary = dataAnalysisService.missionSummary(startTime, endTime, AreaVo().apply { + provinceCode = "31" + cityCode = "3100" + districtCode = "310106" + }) + +// val deviceCode = "TX105" +// val missions = missionMapper.selectByExample(Example(Mission::class.java).apply { +// createCriteria().andEqualTo("deviceCode", deviceCode) +// .andBetween("startTime", startTime, endTime) +// }) +// val clues = sourceTraceRep.fetchList(deviceCode, startTime, endTime) +// .filterIsInstance<PollutedClue?>() +// val summary = missionSummary.execute(startTime, endTime, missions, clues) + println(summary) + } +} \ No newline at end of file diff --git a/src/test/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceControllerTest.kt b/src/test/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceControllerTest.kt index 5988849..c7ea7e8 100644 --- a/src/test/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceControllerTest.kt +++ b/src/test/kotlin/com/flightfeather/uav/biz/sourcetrace/SourceTraceControllerTest.kt @@ -14,6 +14,8 @@ import org.springframework.boot.test.context.SpringBootTest import org.springframework.test.context.junit4.SpringRunner import tk.mybatis.mapper.entity.Example +import java.time.LocalDateTime +import java.time.ZoneId @RunWith(SpringRunner::class) @SpringBootTest @@ -37,30 +39,33 @@ @Test fun autoSourceTrace() { val sourceTraceController = SourceTraceController(sceneInfoRep, sourceTraceRep, false) - 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 {m -> - val rtData = realTimeDataService.getSecondData( - m?.deviceType, - m?.deviceCode, - DateUtil.instance.dateToString(m?.startTime, DateUtil.DateStyle.YYYY_MM_DD_HH_MM_SS), - DateUtil.instance.dateToString(m?.endTime, DateUtil.DateStyle.YYYY_MM_DD_HH_MM_SS), - null, - 1, - 10000 - ) - rtData.data?.forEach { d -> - val rtdVehicle = d.toBaseRealTimeData(RealTimeDataVehicle::class.java) +// 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 -> + val rtData = realTimeDataService.getSecondData( + m?.deviceType, + m?.deviceCode, + DateUtil.instance.dateToString(m?.startTime, DateUtil.DateStyle.YYYY_MM_DD_HH_MM_SS), + DateUtil.instance.dateToString(m?.endTime, DateUtil.DateStyle.YYYY_MM_DD_HH_MM_SS), + null, + 1, + 10000 + ) + rtData.data?.forEach { d -> + val rtdVehicle = d.toBaseRealTimeData(RealTimeDataVehicle::class.java) // Thread.sleep(500) - sourceTraceController.addOneData(rtdVehicle) - } - sourceTraceController.initTask() + sourceTraceController.addOneData(rtdVehicle) } + sourceTraceController.initTask() } // val missions = missionMapper.selectByExample(Example(Mission::class.java).apply { // createCriteria().andEqualTo("deviceType", "0a") @@ -109,7 +114,7 @@ "SH-CN-20240723(02)", // "SH-CN-20250723(01)" ) - mCode.forEach {c -> + mCode.forEach { c -> missionRep.findOne(c)?.let { sourceTraceRep.delete(it) } diff --git a/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImplTest.kt b/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImplTest.kt index f21cc8c..3d3dba5 100644 --- a/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImplTest.kt +++ b/src/test/kotlin/com/flightfeather/uav/lightshare/service/impl/MissionServiceImplTest.kt @@ -2,30 +2,25 @@ import com.flightfeather.uav.biz.FactorFilter import com.flightfeather.uav.biz.report.MissionReport -import com.flightfeather.uav.common.exception.BizException -import com.flightfeather.uav.domain.repository.MissionRep +import com.flightfeather.uav.domain.entity.Mission +import com.flightfeather.uav.domain.mapper.MissionMapper import com.flightfeather.uav.lightshare.service.MissionService - +import org.junit.Test +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 -import javax.servlet.http.HttpServletResponse +import tk.mybatis.mapper.entity.Example -import org.junit.jupiter.api.Assertions.* -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import org.junit.runner.RunWith - -import io.mockk.every -import io.mockk.mockk -import io.mockk.verify - +@RunWith(SpringRunner::class) +@SpringBootTest class MissionServiceImplTest { @Autowired lateinit var missionService: MissionService - private var missionRep: MissionRep = mockk() + @Autowired + lateinit var missionMapper: MissionMapper @Autowired lateinit var missionReport: MissionReport @@ -37,65 +32,12 @@ } @Test - fun `calMissionInfo should throw BizException when mission not found`() { - // Arrange - val missionCode = "M001" - every { missionRep.findOne(missionCode) } returns null - - // Act & Assert - val exception = assertThrows<BizException> { - missionService.calMissionInfo(missionCode) + fun calMissionInfo() { + missionMapper.selectByExample(Example(Mission::class.java).apply { + createCriteria().andGreaterThanOrEqualTo("startTime", "2025-08-08 08:30:00") + }).forEach {mission -> + mission?.let { missionService.calMissionInfo(it.missionCode) } + Thread.sleep(1000) } - assertEquals("璧拌埅浠诲姟涓嶅瓨鍦�", exception.message) - } - - @Test - fun `calMissionInfo should calculate and update mission info successfully`() { - // Arrange - val missionCode = "M001" - val mission = Mission(missionCode) - val data = listOf<RealTimeData>() - - every { missionRep.findOne(missionCode) } returns mission - every { realTimeDataRep.fetchData(mission) } returns data - every { missionUtil.calKilometres(data) } returns 100.0 - every { missionUtil.calRegion(data) } returns "Center" - every { missionRep.updateMission(mission) } returns true - - // Act - val result = missionService.calMissionInfo(missionCode) - - // Assert - assertTrue(result) - assertEquals(100.0f, mission.kilometres) - assertEquals("Center", mission.region) - - verify { - missionRep.findOne(missionCode) - realTimeDataRep.fetchData(mission) - missionUtil.calKilometres(data) - missionUtil.calRegion(data) - missionRep.updateMission(mission) - } - } - - @Test - fun `calMissionInfo should return false when update fails`() { - // Arrange - val missionCode = "M001" - val mission = Mission(missionCode) - val data = listOf<RealTimeData>() - - every { missionRep.findOne(missionCode) } returns mission - every { realTimeDataRep.fetchData(mission) } returns data - every { missionUtil.calKilometres(data) } returns 100.0 - every { missionUtil.calRegion(data) } returns "Center" - every { missionRep.updateMission(mission) } returns false - - // Act - val result = missionService.calMissionInfo(missionCode) - - // Assert - assertFalse(result) } } \ No newline at end of file -- Gitblit v1.9.3