From 4e20a1aaaba1bb843820fca844c20055a33febce Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期五, 19 七月 2024 17:39:19 +0800
Subject: [PATCH] 1. 新增webSocket相关功能
---
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/ProblemlistController.kt | 18 +
src/main/kotlin/cn/flightfeather/supervision/socket/WsSessionManager.kt | 75 +++++++
src/main/kotlin/cn/flightfeather/supervision/socket/config/SPTextWebSocketHandler.kt | 69 ++++++
src/main/resources/application-pro.yml | 3
pom.xml | 5
src/main/kotlin/cn/flightfeather/supervision/socket/processor/WebSocketSender.kt | 30 +++
src/main/kotlin/cn/flightfeather/supervision/SupervisionApplication.kt | 11
src/test/kotlin/cn/flightfeather/supervision/business/location/LocationRoadNearbyTest.kt | 40 +++
src/main/kotlin/cn/flightfeather/supervision/lightshare/web/SubtaskController.kt | 17 +
src/main/kotlin/cn/flightfeather/supervision/common/utils/JsonUtil.kt | 9
src/main/kotlin/cn/flightfeather/supervision/common/log/BizLog.kt | 33 +++
src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/StatisticsVo.kt | 3
src/main/kotlin/cn/flightfeather/supervision/socket/config/WsHandshakeInterceptor.kt | 53 +++++
src/main/resources/application-dev.yml | 1
src/main/kotlin/cn/flightfeather/supervision/common/log/WorkStreamLogInfo.kt | 25 ++
src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/ProblemlistServiceImpl.kt | 24 ++
src/test/kotlin/cn/flightfeather/supervision/business/bgtask/AopTaskCtrlTest.kt | 10
src/main/kotlin/cn/flightfeather/supervision/socket/processor/WebSocketReceiver.kt | 24 ++
src/main/resources/mapper/ds1/ProblemlistMapper.xml | 18 -
src/main/kotlin/cn/flightfeather/supervision/business/location/UtilFile.kt | 2
src/main/resources/application-test.yml | 3
src/main/resources/log4j2.xml | 2
src/main/kotlin/cn/flightfeather/supervision/socket/config/WebSocketConfig.kt | 45 ++++
src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SubtaskServiceImpl.kt | 25 --
src/main/kotlin/cn/flightfeather/supervision/scheduler/ScheduleService.kt | 14 +
src/main/kotlin/cn/flightfeather/supervision/common/log/AbstractLogInfo.kt | 26 ++
src/main/resources/application.yml | 6
27 files changed, 528 insertions(+), 63 deletions(-)
diff --git a/pom.xml b/pom.xml
index 93616db..6d4c67e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -69,6 +69,11 @@
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-websocket</artifactId>
+ </dependency>
+
<!-- https://mvnrepository.com/artifact/org.springframework.plugin/spring-plugin-core -->
<dependency>
<groupId>org.springframework.plugin</groupId>
diff --git a/src/main/kotlin/cn/flightfeather/supervision/SupervisionApplication.kt b/src/main/kotlin/cn/flightfeather/supervision/SupervisionApplication.kt
index e21e4dd..a295360 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/SupervisionApplication.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/SupervisionApplication.kt
@@ -2,6 +2,7 @@
import cn.flightfeather.supervision.business.datafetch.FetchController
import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.ApplicationRunner
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@@ -11,7 +12,10 @@
@SpringBootApplication
@EnableScheduling
-class SupervisionApplication {
+class SupervisionApplication(
+ @Value("\${mode}")
+ var mode: String
+) {
@Autowired
// 闈欏畨鍖哄闂存柦宸ヨ鍙瘉淇℃伅鑾峰彇浠诲姟
@@ -19,7 +23,10 @@
@Bean
fun runner() = ApplicationRunner {
- fetchController.run()
+ if (mode == "pro") {
+ fetchController.run()
+ }
+ println("mode: $mode")
}
}
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/location/UtilFile.kt b/src/main/kotlin/cn/flightfeather/supervision/business/location/UtilFile.kt
index 04e78b4..238fcb0 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/business/location/UtilFile.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/location/UtilFile.kt
@@ -33,6 +33,7 @@
ExcelUtil.MyCell("鍗曚綅鍦板潃", colSpan = 1),
ExcelUtil.MyCell("缁忓害", colSpan = 1),
ExcelUtil.MyCell("绾害", colSpan = 1),
+ ExcelUtil.MyCell("鍖哄幙", colSpan = 1),
ExcelUtil.MyCell("琛楅亾", colSpan = 1),
ExcelUtil.MyCell("甯哥敤鑱旂郴浜�", colSpan = 1),
ExcelUtil.MyCell("鑱旂郴鏂瑰紡", colSpan = 1),
@@ -66,6 +67,7 @@
scense.location ?: "",
scense.longitude?.toDouble() ?: .0,
scense.latitude?.toDouble() ?: .0,
+ scense.districtname ?: "",
scense.townname ?: "",
scense.contacts ?: "",
scense.contactst ?: ""
diff --git a/src/main/kotlin/cn/flightfeather/supervision/common/log/AbstractLogInfo.kt b/src/main/kotlin/cn/flightfeather/supervision/common/log/AbstractLogInfo.kt
new file mode 100644
index 0000000..60baf3b
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/common/log/AbstractLogInfo.kt
@@ -0,0 +1,26 @@
+package cn.flightfeather.supervision.common.log
+
+import cn.flightfeather.supervision.common.utils.JsonUtil
+import com.fasterxml.jackson.annotation.JsonFormat
+import com.google.gson.Gson
+import java.time.LocalDateTime
+
+/**
+ * 鏃ュ織淇℃伅缁撴瀯
+ * @date 2024/7/19
+ * @author feiyu02
+ */
+open class AbstractLogInfo() {
+
+ constructor(event: String) : this() {
+ this.event = event
+ }
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ var time: LocalDateTime = LocalDateTime.now()
+ var event: String = ""
+
+ fun toJsonStr(): String {
+ return JsonUtil.gson.toJson(this)
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/common/log/BizLog.kt b/src/main/kotlin/cn/flightfeather/supervision/common/log/BizLog.kt
new file mode 100644
index 0000000..2d73630
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/common/log/BizLog.kt
@@ -0,0 +1,33 @@
+package cn.flightfeather.supervision.common.log
+
+import cn.flightfeather.supervision.socket.processor.WebSocketSender
+import org.springframework.stereotype.Component
+
+/**
+ * 涓氬姟鏃ュ織绠$悊
+ * 鐩告瘮浜巐og4J2绛夋鏋舵棩蹇楋紝姝ゅ鏃ュ織闇�瑕佽褰曡嚦鏁版嵁搴撴垨鎺ㄩ�佽嚦鐩戞帶骞冲彴锛屾柟渚挎祻瑙堢鐞�
+ * @date 2024/7/19
+ * @author feiyu02
+ */
+@Component
+class BizLog(
+ private val webSocketSender: WebSocketSender,
+) {
+ // TODO: 2024/7/19 鍚庣画闇�娣诲姞鏃ュ織鐩稿叧鐨勬暟鎹簱瀛樺偍鍔熻兘
+
+ /**
+ * 璁板綍甯告�佹棩蹇�
+ */
+ fun info(logInfo: AbstractLogInfo) {
+ // 骞挎挱鏃ュ織
+ webSocketSender.broadcast(logInfo.toJsonStr())
+ // TODO: 2024/7/19 鏃ュ織鍏ュ簱
+ }
+
+ /**
+ * 璁板綍閿欒鏃ュ織
+ */
+ fun error() {
+ // TODO: 2024/7/19 鏃ュ織鍏ュ簱
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/common/log/WorkStreamLogInfo.kt b/src/main/kotlin/cn/flightfeather/supervision/common/log/WorkStreamLogInfo.kt
new file mode 100644
index 0000000..a68683c
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/common/log/WorkStreamLogInfo.kt
@@ -0,0 +1,25 @@
+package cn.flightfeather.supervision.common.log
+
+import cn.flightfeather.supervision.domain.ds1.entity.Userinfo
+
+/**
+ * 宸ヤ綔鏃ュ織
+ * @date 2024/7/19
+ * @author feiyu02
+ */
+class WorkStreamLogInfo : AbstractLogInfo {
+
+ constructor() : super()
+ constructor(userId: String?, userName: String?, type: String?, event: String) : super(event) {
+ this.userId = userId
+ this.userName = userName
+ this.type = type
+ }
+ constructor(userId: String?, userName: String?, event: String) : this(userId, userName, null, event)
+ constructor(userInfo: Userinfo?, event: String) : this(userInfo?.guid, userInfo?.realname, null, event)
+
+ var userId: String? = null
+ var userName: String? = null
+ var type: String? = null
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/common/utils/JsonUtil.kt b/src/main/kotlin/cn/flightfeather/supervision/common/utils/JsonUtil.kt
new file mode 100644
index 0000000..f749e00
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/common/utils/JsonUtil.kt
@@ -0,0 +1,9 @@
+package cn.flightfeather.supervision.common.utils
+
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+
+object JsonUtil {
+
+ val gson: Gson = GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create()
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/ProblemlistServiceImpl.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/ProblemlistServiceImpl.kt
index c2b9ac6..5b28608 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/ProblemlistServiceImpl.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/ProblemlistServiceImpl.kt
@@ -1,6 +1,8 @@
package cn.flightfeather.supervision.lightshare.service.impl
import cn.flightfeather.supervision.common.exception.BizException
+import cn.flightfeather.supervision.common.log.BizLog
+import cn.flightfeather.supervision.common.log.WorkStreamLogInfo
import cn.flightfeather.supervision.domain.ds1.entity.Problemlist
import cn.flightfeather.supervision.domain.ds1.entity.Scense
import cn.flightfeather.supervision.common.utils.Constant
@@ -42,6 +44,7 @@
private val taskRep: TaskRep,
private val subTaskRep: SubTaskRep,
private val problemRep: ProblemRep,
+ private val bizLog: BizLog,
) : ProblemlistService {
@Resource
@@ -374,14 +377,21 @@
return BaseResponse(false, "闈炴硶鐨勬搷浣滄寚浠�")
}
val p = problemlistMapper.selectByPrimaryKey(pId) ?: return BaseResponse(false, "闂涓嶅瓨鍦�")
+ val subtask = p.stguid?.let { subTaskRep.findOne(it) }
val response = BaseResponse<String>(true)
+ var event = ""
p.apply {
this.remark = userName
if (extension3 == Constant.PROBLEM_UNCHECKED) {
+ event = "鍦�${subtask?.scensename}瀹℃牳浜嗕竴涓棶棰�"
when (action) {
- 0.toByte() -> extension3 = Constant.PROBLEM_CHECK_PASS
- 1.toByte() -> extension3 = Constant.PROBLEM_CHECK_FAIL
+ 0.toByte() -> {
+ extension3 = Constant.PROBLEM_CHECK_PASS
+ }
+ 1.toByte() -> {
+ extension3 = Constant.PROBLEM_CHECK_FAIL
+ }
2.toByte(),
3.toByte(),
-> {
@@ -403,6 +413,7 @@
} else {
Constant.CHANGE_CHECK_FAIL
}
+ event = "鍦�${subtask?.scensename}瀹℃牳浜嗕竴涓暣鏀�"
} else {
response.success = false
response.message = "闂杩樻湭鏁存敼锛屾棤娉曡繘琛屾暣鏀瑰鏍革紒鎿嶄綔鏃犳晥"
@@ -410,6 +421,7 @@
}
}
} else if (extension3 == Constant.CHANGE_UNCHECKED) {
+ event = "鍦�${subtask?.scensename}瀹℃牳浜嗕竴涓暣鏀�"
when (action) {
0.toByte(),
1.toByte(),
@@ -439,6 +451,8 @@
if (r != 1) {
response.success = false
response.message = "闂鏇存柊澶辫触锛�"
+ } else {
+ bizLog.info(WorkStreamLogInfo(subtask?.executorguids, subtask?.executorrealtimes, event))
}
}
return response
@@ -518,6 +532,12 @@
inspectionMapper.updateByPrimaryKey(inspection)
}
+ problemlist.stguid?.let {
+ val subtask = subTaskRep.findOne(it)
+ val event = "鍦�${subtask?.scensename}鏂板涓�涓棶棰�"
+ bizLog.info(WorkStreamLogInfo(subtask?.executorguids, subtask?.executorrealtimes, event))
+ }
+
return BaseResponse(true)
}
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SubtaskServiceImpl.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SubtaskServiceImpl.kt
index 37f67a2..96d689b 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SubtaskServiceImpl.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SubtaskServiceImpl.kt
@@ -431,6 +431,7 @@
if (!bool){
daytaskVo.runingstatus = Constant.TaskProgress.RUNINGSTATUS3.text
}
+
}
//涓よ�呯姸鎬佺浉鍚屾椂涓嶅仛淇敼锛屽叾浣欐儏鍐垫棩浠诲姟閮戒负姝e湪鎵ц
else if (subtask.status != daytaskVo.runingstatus){
@@ -442,30 +443,6 @@
//****************************************************************************************
subtaskMapper.updateByPrimaryKeySelective(subtask)
}
-
- //鍒ゆ柇瀵瑰簲椤跺眰浠诲姟鐨勬墽琛岀姸鎬�
-// val daytaskVolist = taskService.getDayTaskByTaskID(toptaskVo.tguid!!)
-// val iterator: Iterator<TaskVo> = daytaskVolist.iterator()
-// if (daytaskVo.runingstatus == Constant.TaskProgress.RUNINGSTATUS3.text
-// && toptaskVo.runingstatus == Constant.TaskProgress.RUNINGSTATUS2.text) {
-// var bool = false
-// while (iterator.hasNext()) {
-// val tmp = iterator.next()
-// if (tmp.runingstatus != Constant.TaskProgress.RUNINGSTATUS3.text) {
-// bool = true
-// break
-// }
-// }
-// if (!bool){
-// toptaskVo.runingstatus = Constant.TaskProgress.RUNINGSTATUS3.text
-// }
-// }
-// else if (daytaskVo.runingstatus != toptaskVo.runingstatus){
-// toptaskVo.runingstatus = Constant.TaskProgress.RUNINGSTATUS2.text
-// }
-// val toptask = Task()
-// BeanUtils.copyProperties(toptaskVo, toptask)
-// taskMapper.updateByPrimaryKeySelective(toptask)
//瀵瑰凡缁撴潫鐨勫瓙浠诲姟杩涜鑷姩璇勫垎
if (subtask.status == Constant.TaskProgress.RUNINGSTATUS3.text) {
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/StatisticsVo.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/StatisticsVo.kt
index 71dd692..15f23c7 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/StatisticsVo.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/StatisticsVo.kt
@@ -1,5 +1,6 @@
package cn.flightfeather.supervision.lightshare.vo
+import cn.flightfeather.supervision.domain.ds1.entity.Problemlist
import com.fasterxml.jackson.annotation.JsonInclude
import java.util.*
@@ -16,4 +17,6 @@
var changeCount: Int = 0
+ var problems: List<Problemlist>? = null
+
}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/ProblemlistController.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/ProblemlistController.kt
index de6e270..416e7e9 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/ProblemlistController.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/ProblemlistController.kt
@@ -1,7 +1,10 @@
package cn.flightfeather.supervision.lightshare.web
+import cn.flightfeather.supervision.common.log.BizLog
+import cn.flightfeather.supervision.common.log.WorkStreamLogInfo
import cn.flightfeather.supervision.domain.ds1.entity.Problemlist
import cn.flightfeather.supervision.lightshare.service.ProblemlistService
+import cn.flightfeather.supervision.lightshare.service.SubtaskService
import cn.flightfeather.supervision.lightshare.vo.*
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
@@ -12,7 +15,10 @@
@Api(tags = ["ProblemlistController"], description = "鐩戠闂API鎺ュ彛")
@RestController
@RequestMapping("/problemlist")
-class ProblemlistController(val problemlistService: ProblemlistService) {
+class ProblemlistController(
+ val problemlistService: ProblemlistService,
+ val subtaskService: SubtaskService, private val bizLog: BizLog,
+) {
@GetMapping
fun getAll() = problemlistService.findAll()
@@ -20,7 +26,15 @@
fun add(@RequestBody problemlist: Problemlist) = problemlistService.save(problemlist)
@PostMapping
- fun update(@RequestBody problemlist: Problemlist) = problemlistService.update(problemlist)
+ fun update(@RequestBody problemlist: Problemlist):Int{
+ val res = problemlistService.update(problemlist)
+ problemlist.stguid?.let {
+ val subtask = subtaskService.findByID(it)
+ val event = "鍦�${subtask.scensename}鏂板涓�涓棶棰�"
+ bizLog.info(WorkStreamLogInfo(subtask.executorguids, subtask.executorrealtimes, event))
+ }
+ return res
+ }
@GetMapping("/{id}")
fun getById(@PathVariable id: String) = problemlistService.findByID(id)
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/SubtaskController.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/SubtaskController.kt
index dca0a62..cf2670e 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/SubtaskController.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/SubtaskController.kt
@@ -1,5 +1,8 @@
package cn.flightfeather.supervision.lightshare.web
+import cn.flightfeather.supervision.common.log.BizLog
+import cn.flightfeather.supervision.common.log.WorkStreamLogInfo
+import cn.flightfeather.supervision.common.utils.Constant
import cn.flightfeather.supervision.domain.ds1.entity.Subtask
import cn.flightfeather.supervision.lightshare.service.SubtaskService
import cn.flightfeather.supervision.lightshare.vo.AreaVo
@@ -13,7 +16,7 @@
@Api(tags = ["SubtaskController"], description = "宸℃煡瀛愪换鍔PI鎺ュ彛")
@RestController
@RequestMapping("/subtask")
-class SubtaskController(val subtaskService: SubtaskService) {
+class SubtaskController(val subtaskService: SubtaskService, private val bizLog: BizLog) {
@GetMapping
fun getAll() = subtaskService.findAll()
@@ -24,7 +27,17 @@
fun addList(@RequestBody subtasklist: List<Subtask>) = subtaskService.saveList(subtasklist)
@PostMapping
- fun update(@RequestBody subtask: Subtask) = subtaskService.update(subtask)
+ fun update(@RequestBody subtask: Subtask): Int {
+ val res = subtaskService.update(subtask)
+ if (subtask.status == Constant.TaskProgress.RUNINGSTATUS3.text) {
+ val event = "鍦�${subtask.scensename}缁撴潫宸℃煡"
+ bizLog.info(WorkStreamLogInfo(subtask.executorguids, subtask.executorrealtimes, event))
+ }else if (subtask.status == Constant.TaskProgress.RUNINGSTATUS2.text) {
+ val event = "鍦�${subtask.scensename}寮�濮嬪贰鏌�"
+ bizLog.info(WorkStreamLogInfo(subtask.executorguids, subtask.executorrealtimes, event))
+ }
+ return res
+ }
@GetMapping("/{id}")
fun getById(@PathVariable id: String) = subtaskService.findByID(id)
diff --git a/src/main/kotlin/cn/flightfeather/supervision/scheduler/ScheduleService.kt b/src/main/kotlin/cn/flightfeather/supervision/scheduler/ScheduleService.kt
index 45ebef0..c34d071 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/scheduler/ScheduleService.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/scheduler/ScheduleService.kt
@@ -6,9 +6,11 @@
import cn.flightfeather.supervision.lightshare.vo.AreaVo
import org.slf4j.Logger
import org.slf4j.LoggerFactory
+import org.springframework.beans.factory.annotation.Value
import org.springframework.scheduling.annotation.Async
import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Component
+import java.time.LocalDate
import java.time.LocalDateTime
/**
@@ -23,6 +25,8 @@
*/
@Component
class ScheduleService(
+ @Value("\${mode}")
+ var mode: String,
private val taskFinishSubtask: TaskFinishSubtask,
private val taskFinishTopTask: TaskFinishTopTask,
private val aopTaskCtrl: AopTaskCtrl,
@@ -32,6 +36,8 @@
@Async
@Scheduled(cron = "0 0 0 * * *")
fun eachDay() {
+ if (mode != "pro") return
+
logger.info("=====>>>>>姣忔棩浠诲姟鎵ц {}", System.currentTimeMillis())
taskFinishSubtask.handle()
logger.info("=====>>>>>姣忔棩浠诲姟缁撴潫 {}", System.currentTimeMillis())
@@ -40,18 +46,22 @@
@Async
@Scheduled(cron = "0 0 0 * * MON")
fun eachWeek() {
+ if (mode != "pro") return
+
logger.info("=====>>>>>姣忓懆浠诲姟鎵ц {}", System.currentTimeMillis())
// 鎵ц涓婂懆鐨勮嚜璇勪换鍔�
- aopTaskCtrl.startAllEvaluation(LocalDateTime.now())
+ aopTaskCtrl.startAllEvaluation(LocalDate.now().atStartOfDay())
logger.info("=====>>>>>姣忓懆浠诲姟缁撴潫 {}", System.currentTimeMillis())
}
@Async
@Scheduled(cron = "0 0 0 2 * *")
fun eachMonth() {
+ if (mode != "pro") return
+
logger.info("=====>>>>>姣忔湀浠诲姟鎵ц {}", System.currentTimeMillis())
// 鎵ц涓婁釜鏈堢殑瀹屾暣鑷瘎浠诲姟
- aopTaskCtrl.startAll(LocalDateTime.now().minusMonths(1))
+ aopTaskCtrl.startAll(LocalDate.now().atStartOfDay().minusMonths(1))
// 鎵ц椤跺眰浠诲姟鑷姩缁撴潫浠诲姟
taskFinishTopTask.handle()
logger.info("=====>>>>>姣忔湀浠诲姟缁撴潫 {}", System.currentTimeMillis())
diff --git a/src/main/kotlin/cn/flightfeather/supervision/socket/WsSessionManager.kt b/src/main/kotlin/cn/flightfeather/supervision/socket/WsSessionManager.kt
new file mode 100644
index 0000000..8ee361e
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/socket/WsSessionManager.kt
@@ -0,0 +1,75 @@
+package cn.flightfeather.supervision.socket
+
+import org.springframework.web.socket.WebSocketSession
+import java.io.IOException
+import java.util.concurrent.ConcurrentHashMap
+
+/**
+ *
+ * @date 2024/7/19
+ * @author feiyu02
+ */
+object WsSessionManager {
+ /**
+ * 淇濆瓨杩炴帴 session 鐨勫湴鏂�
+ */
+ private val SESSION_POOL = ConcurrentHashMap<String, WebSocketSession>()
+
+ /**
+ * 娣诲姞 session
+ *
+ * @param key
+ */
+ fun add(key: String, session: WebSocketSession) {
+ // 娣诲姞 session
+ SESSION_POOL[key] = session
+ }
+
+ /**
+ * 鍒犻櫎 session,浼氳繑鍥炲垹闄ょ殑 session
+ *
+ * @param key
+ * @return
+ */
+ fun remove(key: String?): WebSocketSession? {
+ // 鍒犻櫎 session
+ return SESSION_POOL.remove(key)
+ }
+
+ /**
+ * 鍒犻櫎骞跺悓姝ュ叧闂繛鎺�
+ *
+ * @param key
+ */
+ fun removeAndClose(key: String?) {
+ val session: WebSocketSession? = remove(key)
+ if (session != null) {
+ try {
+ // 鍏抽棴杩炴帴
+ session.close()
+ } catch (e: IOException) {
+ // todo: 鍏抽棴鍑虹幇寮傚父澶勭悊
+ e.printStackTrace()
+ }
+ }
+ }
+
+ /**
+ * 鑾峰緱 session
+ *
+ * @param key
+ * @return
+ */
+ operator fun get(key: String?): WebSocketSession? {
+ // 鑾峰緱 session
+ return SESSION_POOL[key]
+ }
+
+ fun eachSession(action:(session:WebSocketSession) -> Unit) {
+ SESSION_POOL.forEachEntry(10){
+ action(it.value)
+ }
+ }
+}
+
+
diff --git a/src/main/kotlin/cn/flightfeather/supervision/socket/config/SPTextWebSocketHandler.kt b/src/main/kotlin/cn/flightfeather/supervision/socket/config/SPTextWebSocketHandler.kt
new file mode 100644
index 0000000..49bcb73
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/socket/config/SPTextWebSocketHandler.kt
@@ -0,0 +1,69 @@
+package cn.flightfeather.supervision.socket.config
+
+import cn.flightfeather.supervision.socket.WsSessionManager
+import cn.flightfeather.supervision.socket.processor.WebSocketReceiver
+import org.springframework.stereotype.Component
+import org.springframework.web.socket.CloseStatus
+import org.springframework.web.socket.TextMessage
+import org.springframework.web.socket.WebSocketSession
+import org.springframework.web.socket.handler.TextWebSocketHandler
+
+/**
+ *
+ * @date 2024/7/19
+ * @author feiyu02
+ */
+@Component
+class SPTextWebSocketHandler(private val webSocketReceiver: WebSocketReceiver) : TextWebSocketHandler() {
+ /**
+ * socket 寤虹珛鎴愬姛浜嬩欢
+ *
+ * @param session
+ * @throws Exception
+ */
+ @Throws(Exception::class)
+ override fun afterConnectionEstablished(session: WebSocketSession) {
+ val sessionId = session.attributes["session_id"]
+ if (sessionId != null) {
+ // 鐢ㄦ埛杩炴帴鎴愬姛锛屾斁鍏ュ湪绾跨敤鎴风紦瀛�
+ WsSessionManager.add(sessionId.toString(), session)
+ } else {
+ throw RuntimeException("鐢ㄦ埛鐧诲綍宸茬粡澶辨晥!")
+ }
+ }
+
+ /**
+ * 鎺ユ敹娑堟伅浜嬩欢
+ *
+ * @param session
+ * @param message
+ * @throws Exception
+ */
+ @Throws(Exception::class)
+ override fun handleTextMessage(session: WebSocketSession, message: TextMessage) {
+ // 鑾峰緱瀹㈡埛绔紶鏉ョ殑娑堟伅
+ val payload = message.payload
+ val sessionId = session.attributes["session_id"]
+ println("server 鎺ユ敹鍒� $sessionId 鍙戦�佺殑 $payload")
+ webSocketReceiver.onReceiveMsg(payload)
+// session.sendMessage(TextMessage("server 鍙戦�佺粰 " + sessionId + " 娑堟伅 " + payload + " " + LocalDateTime.now()
+// .toString()))
+ }
+
+ /**
+ * socket 鏂紑杩炴帴鏃�
+ *
+ * @param session
+ * @param status
+ * @throws Exception
+ */
+ @Throws(Exception::class)
+ override fun afterConnectionClosed(session: WebSocketSession, status: CloseStatus) {
+ val sessionId = session.attributes["session_id"]
+ if (sessionId != null) {
+ // 鐢ㄦ埛閫�鍑猴紝绉婚櫎缂撳瓨
+ WsSessionManager.remove(sessionId.toString())
+ }
+ }
+}
+
diff --git a/src/main/kotlin/cn/flightfeather/supervision/socket/config/WebSocketConfig.kt b/src/main/kotlin/cn/flightfeather/supervision/socket/config/WebSocketConfig.kt
new file mode 100644
index 0000000..80c3d2d
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/socket/config/WebSocketConfig.kt
@@ -0,0 +1,45 @@
+package cn.flightfeather.supervision.socket.config
+
+import cn.flightfeather.supervision.scheduler.ScheduleService
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import org.springframework.scheduling.TaskScheduler
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler
+import org.springframework.web.socket.config.annotation.EnableWebSocket
+import org.springframework.web.socket.config.annotation.WebSocketConfigurer
+import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry
+import javax.annotation.Nullable
+
+/**
+ *
+ * @date 2024/7/19
+ * @author feiyu02
+ */
+@Configuration
+@EnableWebSocket
+class WebSocketConfig(
+ private val handler: SPTextWebSocketHandler,
+ private val wsHandshakeInterceptor: WsHandshakeInterceptor
+) : WebSocketConfigurer {
+
+ override fun registerWebSocketHandlers(registry: WebSocketHandlerRegistry) {
+ registry
+ .addHandler(handler, "workstream")
+ .addInterceptors(wsHandshakeInterceptor)
+ .setAllowedOrigins("*")
+ }
+
+ /**
+ * webSocket瀹氭椂鍣ㄩ厤缃紝瑙e喅鍚屾浣跨敤瀹氭椂鍣╗ScheduleService]鏃剁殑鍐茬獊闂
+ */
+ @Bean
+ @Nullable
+ fun taskScheduler():TaskScheduler {
+ return ThreadPoolTaskScheduler().apply {
+ setThreadNamePrefix("SockJS-")
+ poolSize = Runtime.getRuntime().availableProcessors()
+ isRemoveOnCancelPolicy = true
+ }
+ }
+}
+
diff --git a/src/main/kotlin/cn/flightfeather/supervision/socket/config/WsHandshakeInterceptor.kt b/src/main/kotlin/cn/flightfeather/supervision/socket/config/WsHandshakeInterceptor.kt
new file mode 100644
index 0000000..4466ccc
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/socket/config/WsHandshakeInterceptor.kt
@@ -0,0 +1,53 @@
+package cn.flightfeather.supervision.socket.config
+
+import org.apache.logging.log4j.util.Strings
+import org.springframework.http.server.ServerHttpRequest
+import org.springframework.http.server.ServerHttpResponse
+import org.springframework.stereotype.Component
+import org.springframework.web.socket.WebSocketHandler
+import org.springframework.web.socket.server.HandshakeInterceptor
+
+/**
+ *
+ * @date 2024/7/19
+ * @author feiyu02
+ */
+@Component
+class WsHandshakeInterceptor : HandshakeInterceptor {
+ /**
+ * 鎻℃墜鍓�
+ */
+ @Throws(Exception::class)
+ override fun beforeHandshake(
+ request: ServerHttpRequest,
+ response: ServerHttpResponse,
+ wsHandler: WebSocketHandler,
+ attributes: MutableMap<String, Any>,
+ ): Boolean {
+ println("鎻℃墜寮�濮�")
+ val hostName = request.remoteAddress.hostName
+ // TODO: 2024/7/19 鍚庣画鍙坊鍔犵敤鎴疯韩浠介獙璇佹満鍒�,sessionId鍙浛鎹负瀹為檯鐨勭敤鎴穒d
+ val sessionId = hostName + (Math.random() * 1000).toInt().toString()
+ if (Strings.isNotBlank(sessionId)) {
+ // 鏀惧叆灞炴�у煙
+ attributes["session_id"] = sessionId
+ println("鐢ㄦ埛 session_id $sessionId 鎻℃墜鎴愬姛锛�")
+ return true
+ }
+ println("鐢ㄦ埛鐧诲綍宸插け鏁�")
+ return false
+ }
+
+ /**
+ * 鎻℃墜鍚�
+ */
+ override fun afterHandshake(
+ request: ServerHttpRequest,
+ response: ServerHttpResponse,
+ wsHandler: WebSocketHandler,
+ exception: Exception?,
+ ) {
+ println("鎻℃墜瀹屾垚")
+ }
+}
+
diff --git a/src/main/kotlin/cn/flightfeather/supervision/socket/processor/WebSocketReceiver.kt b/src/main/kotlin/cn/flightfeather/supervision/socket/processor/WebSocketReceiver.kt
new file mode 100644
index 0000000..d8c42f9
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/socket/processor/WebSocketReceiver.kt
@@ -0,0 +1,24 @@
+package cn.flightfeather.supervision.socket.processor
+
+import cn.flightfeather.supervision.common.log.BizLog
+import cn.flightfeather.supervision.common.log.WorkStreamLogInfo
+import org.springframework.stereotype.Component
+
+/**
+ * webSocket娑堟伅鎺ユ敹绠$悊
+ * @date 2024/7/19
+ * @author feiyu02
+ */
+@Component
+class WebSocketReceiver(private val bizLog: BizLog) {
+
+ /**
+ * 鎺ユ敹娑堟伅澶勭悊
+ */
+ fun onReceiveMsg(msg: String) {
+ // debug
+ if (msg == "test"){
+ bizLog.info(WorkStreamLogInfo("8FAqSPnAA8ry4ExX", "鏈辨寮�", "鍦ㄤ笂娴峰箍鍙戠矇鐓ょ伆鏈夐檺鍏徃鏂板涓�涓棶棰�"))
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/socket/processor/WebSocketSender.kt b/src/main/kotlin/cn/flightfeather/supervision/socket/processor/WebSocketSender.kt
new file mode 100644
index 0000000..83ba84f
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/socket/processor/WebSocketSender.kt
@@ -0,0 +1,30 @@
+package cn.flightfeather.supervision.socket.processor
+
+import cn.flightfeather.supervision.socket.WsSessionManager
+import org.springframework.stereotype.Component
+import org.springframework.web.socket.TextMessage
+
+/**
+ * webSocket娑堟伅鍙戦�佺鐞�
+ * @date 2024/7/19
+ * @author feiyu02
+ */
+@Component
+class WebSocketSender {
+
+ /**
+ * 鍗曠嫭鍙戦�佹秷鎭�
+ */
+ fun sendMsg(msg: String, sessionId: String) {
+ WsSessionManager[sessionId]?.sendMessage(TextMessage(msg))
+ }
+
+ /**
+ * 骞挎挱缁欐墍鏈変汉
+ */
+ fun broadcast(msg: String) {
+ WsSessionManager.eachSession {
+ it.sendMessage(TextMessage(msg))
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 5af1db9..5c35911 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -19,3 +19,4 @@
imgPath: target
filePath: target
+mode: dev
diff --git a/src/main/resources/application-pro.yml b/src/main/resources/application-pro.yml
index b5a8da8..fd3c0f7 100644
--- a/src/main/resources/application-pro.yml
+++ b/src/main/resources/application-pro.yml
@@ -12,4 +12,5 @@
password: ledger_fxxchackxr
imgPath: D:/02product/04supervision/images/
-filePath: D:/02product/04supervision/files/
\ No newline at end of file
+filePath: D:/02product/04supervision/files/
+mode: pro
\ No newline at end of file
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index 9bf72d3..7541789 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -28,4 +28,5 @@
enabled: true
imgPath: C:\02product\supervision\images
-filePath: C:\02product\supervision\files
\ No newline at end of file
+filePath: C:\02product\supervision\files
+mode: test
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 3818bca..350ca41 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -87,9 +87,9 @@
#logging璺緞璁剧疆
logging:
-# config: classpath:log4j2.xml
- level:
- cn.flightfeather.supervision.domain: debug
+ config: classpath:log4j2.xml
+# level:
+# cn.flightfeather.supervision.domain: debug
springfox:
documentation:
diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
index 281c647..0290231 100644
--- a/src/main/resources/log4j2.xml
+++ b/src/main/resources/log4j2.xml
@@ -78,7 +78,7 @@
</logger>
<root level="all">
- <appender-ref ref="Console"/>
+<!-- <appender-ref ref="Console"/>-->
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
diff --git a/src/main/resources/mapper/ds1/ProblemlistMapper.xml b/src/main/resources/mapper/ds1/ProblemlistMapper.xml
index 857d461..ff89068 100644
--- a/src/main/resources/mapper/ds1/ProblemlistMapper.xml
+++ b/src/main/resources/mapper/ds1/ProblemlistMapper.xml
@@ -53,6 +53,7 @@
<result property="endTime" column="endTime"/>
<result property="count" column="count"/>
<result property="changeCount" column="changeCount"/>
+<!-- <collection property="problems" ofType="cn.flightfeather.supervision.domain.ds1.entity.Problemlist" resultMap="BaseResultMap"/>-->
</resultMap>
<resultMap id="SceneProblemSummary" type="cn.flightfeather.supervision.lightshare.vo.SceneProblemSummary">
<id property="sceneId" column="sceneId"/>
@@ -75,23 +76,6 @@
LEFT JOIN sm_t_scense AS f ON a.S_GUID = f.S_GUID
LEFT JOIN tm_t_subtask AS c ON a.ST_GUID = c.ST_GUID
<where>
-<!-- a.ST_GUID IN (-->
-<!-- SELECT-->
-<!-- d.ST_GUID-->
-<!-- FROM-->
-<!-- tm_t_subtask AS d LEFT JOIN tm_t_task AS e ON d.T_GUID = e.T_GUID-->
-<!-- WHERE-->
-<!-- e.T_LevelNum = '2'-->
-<!-- <if test="startTime != null">-->
-<!-- AND e.T_StartTime <= #{startTime}-->
-<!-- </if>-->
-<!-- <if test="endTime != null">-->
-<!-- AND e.T_EndTime >= #{endTime}-->
-<!-- </if>-->
-<!-- <if test="districtCode != null">-->
-<!-- AND e.T_DistrictCode = #{districtCode}-->
-<!-- </if>-->
-<!-- )-->
<if test="startTime != null">
AND c.ST_PlanStartTime >= #{startTime}
</if>
diff --git a/src/test/kotlin/cn/flightfeather/supervision/business/bgtask/AopTaskCtrlTest.kt b/src/test/kotlin/cn/flightfeather/supervision/business/bgtask/AopTaskCtrlTest.kt
index d8b9149..242ae46 100644
--- a/src/test/kotlin/cn/flightfeather/supervision/business/bgtask/AopTaskCtrlTest.kt
+++ b/src/test/kotlin/cn/flightfeather/supervision/business/bgtask/AopTaskCtrlTest.kt
@@ -12,6 +12,7 @@
import java.io.BufferedReader
import java.io.InputStreamReader
import java.time.LocalDate
+import java.time.LocalDateTime
@RunWith(SpringRunner::class)
@@ -27,11 +28,18 @@
@Test
fun startEvaluation() {
- val time = LocalDate.of(2024, 6, 23).atStartOfDay()
+ val time = LocalDate.of(2024, 7, 23).atStartOfDay()
aopTaskCtrl.startEvaluation(aopTaskCtrl.getArea(time, "310106", "闈欏畨鍖�", Constant.SceneType.TYPE1))
}
@Test
+ fun startAllEvaluation() {
+// val time = LocalDate.of(2024, 6, 23).atStartOfDay()
+ val time = LocalDate.now().atStartOfDay()
+ aopTaskCtrl.startAllEvaluation(time)
+ }
+
+ @Test
fun startNewTask(){
val time = LocalDate.of(2024, 6, 23).atStartOfDay()
aopTaskCtrl.startNewTask(aopTaskCtrl.getArea(time, "310106", "闈欏畨鍖�", Constant.SceneType.TYPE1))
diff --git a/src/test/kotlin/cn/flightfeather/supervision/business/location/LocationRoadNearbyTest.kt b/src/test/kotlin/cn/flightfeather/supervision/business/location/LocationRoadNearbyTest.kt
index e159369..d519504 100644
--- a/src/test/kotlin/cn/flightfeather/supervision/business/location/LocationRoadNearbyTest.kt
+++ b/src/test/kotlin/cn/flightfeather/supervision/business/location/LocationRoadNearbyTest.kt
@@ -45,12 +45,42 @@
// LocationRoadNearby.BasePlace("鍚曢潚璺�-鏈卞悤鍏矾-鏈卞钩鍏矾", Pair(121.136318,30.833325), Pair(121.148624,30.836094)),
// LocationRoadNearby.BasePlace("娉栨咕鏀矾-鍚曢潚璺�-鏈卞钩鍏矾", Pair(121.155048,30.835229), Pair(121.148659,30.829861)),
- LocationRoadNearby.BasePlace("寰愭眹涓婂笀澶�", Pair(121.419384,31.161433), Pair(121.419384,31.161433)),
- LocationRoadNearby.BasePlace("闈欏畨鐩戞祴绔欏浗鎺х偣", Pair(121.429439, 31.223632), Pair(121.429439, 31.223632)),
- LocationRoadNearby.BasePlace("閲戝北澶ч亾2000鍙�", Pair(121.3404, 30.744262), Pair(121.3404, 30.744262)),
- LocationRoadNearby.BasePlace("浠欓湠绔�", Pair(121.394775, 31.203982), Pair(121.419384,31.161433)),
+// LocationRoadNearby.BasePlace("寰愭眹涓婂笀澶�", Pair(121.419384,31.161433), Pair(121.419384,31.161433)),
+// LocationRoadNearby.BasePlace("闈欏畨鐩戞祴绔欏浗鎺х偣", Pair(121.429439, 31.223632), Pair(121.429439, 31.223632)),
+// LocationRoadNearby.BasePlace("閲戝北澶ч亾2000鍙�", Pair(121.3404, 30.744262), Pair(121.3404, 30.744262)),
+ LocationRoadNearby.BasePlace("浠欓湠绔�", Pair(121.394775, 31.203982), Pair(121.394775, 31.203982)),
+
+// LocationRoadNearby.BasePlace("绋嬫ˉ绔�", Pair(121.362928, 31.192925), Pair(121.362928, 31.192925)),
+// LocationRoadNearby.BasePlace("闀块槼绔�", Pair(121.424603, 31.223644), Pair(121.424603, 31.223644)),
+
+
+// LocationRoadNearby.BasePlace("鍙ゅ矖璺�", Pair(121.411559, 30.791152), Pair(121.423728, 30.788246)),
+// LocationRoadNearby.BasePlace("涓滄柟绾腑蹇冭矾", Pair(121.141623, 30.870369), Pair(121.160251, 30.872135)),
+// LocationRoadNearby.BasePlace("婕惧钩璺�", Pair(121.222056, 30.852923), Pair(121.237356, 30.853606)),
+// LocationRoadNearby.BasePlace("鍏村瘨璺�", Pair(121.045916, 30.831142), Pair(121.052351, 30.836051)),
+// LocationRoadNearby.BasePlace("浜湵鍏矾", Pair(121.328213, 30.874901), Pair(121.335347, 30.860441)),
+// LocationRoadNearby.BasePlace("鍗叓璺�", Pair(121.286369, 30.704997), Pair(121.279021, 30.722918)),
+// LocationRoadNearby.BasePlace("绉嬪疄璺�", Pair(121.273549, 30.720349), Pair(121.277212, 30.726353)),
+// LocationRoadNearby.BasePlace("鎭掑悍璺�", Pair(121.335671, 30.85661), Pair(121.342813, 30.857601)),
+// LocationRoadNearby.BasePlace("鏉炬邯璺�", Pair(121.236017, 30.894031), Pair(121.24154, 30.892297)),
+// LocationRoadNearby.BasePlace("鍏存璺�", Pair(121.105814, 30.876818), Pair(121.106139, 30.868925)),
+// LocationRoadNearby.BasePlace("鑽d赴璺�", Pair(121.236894, 30.83599), Pair(121.253117, 30.835875)),
+// LocationRoadNearby.BasePlace("鍙舵柊鍏矾", Pair(121.164193, 30.936096), Pair(121.023036, 30.933981)),
+// LocationRoadNearby.BasePlace("闃冲悍璺�", Pair(121.355063, 30.780308), Pair(121.35446, 30.774935)),
+// LocationRoadNearby.BasePlace("寮犳棫鏀矾", Pair(121.321495, 30.783227), Pair(121.325356, 30.785677)),
+// LocationRoadNearby.BasePlace("鍐滃缓璺�", Pair(121.134021, 30.855966), Pair(121.141504, 30.856559)),
+// LocationRoadNearby.BasePlace("鍚堝睍璺�", Pair(121.407831, 30.801774), Pair(121.426746, 30.797785)),
+// LocationRoadNearby.BasePlace("澶╁崕璺�", Pair(121.451848, 30.776257), Pair(121.4337, 30.80644)),
+// LocationRoadNearby.BasePlace("鐝犳腐琛�", Pair(121.337652, 30.847802), Pair(121.345829, 30.846835)),
+// LocationRoadNearby.BasePlace("鑽d笢璺�", Pair(121.249271, 30.832921), Pair(121.249176, 30.835928)),
+// LocationRoadNearby.BasePlace("涔濅赴璺�", Pair(121.254114, 30.903438), Pair(121.254715, 30.893363)),
)
- listOf(500.0, 1000.0, 2000.0, 3000.0).forEach {
+ listOf(
+ 500.0,
+// 1000.0,
+ 2000.0,
+ 3000.0
+ ).forEach {
locationRoadNearby.searchList(bList, it)
}
}
--
Gitblit v1.9.3