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