diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index bb066f4..6c9625f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotTrajectoryInfoMapper; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; @@ -34,11 +36,12 @@ public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + private final IRobotCacheService cacheService; - - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService, IRobotCacheService cacheService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; + this.cacheService = cacheService; } @Override @@ -54,14 +57,15 @@ }); //读取导航状态,如果导航未开启则不存储 - RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); - if (statusInfo != null && responseDTO.getMsg() != null) { +// RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); + Long routeId= cacheService.readRouteId(Long.valueOf(robotId)); + if (routeId != null && responseDTO.getMsg() != null) { PoseMessageResponseDTO dto = responseDTO.getMsg(); //执行循迹 保存当前轨迹信息 //更新实时定位信息 - robotStatusInfoService.updateRobotPoint(dto,robotId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId, dto); infoService.pointTestCallBack(dto, robotId); - if (statusInfo.getCurrRouteId() != null) { + if (routeId != null) { RobotTrajectoryInfo info = new RobotTrajectoryInfo(); info.setRobotId(Long.valueOf(robotId)); info.setCreateTime(new Date()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index bb066f4..6c9625f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotTrajectoryInfoMapper; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; @@ -34,11 +36,12 @@ public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + private final IRobotCacheService cacheService; - - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService, IRobotCacheService cacheService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; + this.cacheService = cacheService; } @Override @@ -54,14 +57,15 @@ }); //读取导航状态,如果导航未开启则不存储 - RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); - if (statusInfo != null && responseDTO.getMsg() != null) { +// RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); + Long routeId= cacheService.readRouteId(Long.valueOf(robotId)); + if (routeId != null && responseDTO.getMsg() != null) { PoseMessageResponseDTO dto = responseDTO.getMsg(); //执行循迹 保存当前轨迹信息 //更新实时定位信息 - robotStatusInfoService.updateRobotPoint(dto,robotId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId, dto); infoService.pointTestCallBack(dto, robotId); - if (statusInfo.getCurrRouteId() != null) { + if (routeId != null) { RobotTrajectoryInfo info = new RobotTrajectoryInfo(); info.setRobotId(Long.valueOf(robotId)); info.setCreateTime(new Date()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java new file mode 100644 index 0000000..a0f578e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.casic.missiles.modular.robot.service.ITaskInfoImgService; +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.casic.missiles.modular.robot.dao.TaskInfoImgMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; + + +/** + *

+ * 任务照片存储 服务实现类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +@Service +public class TaskInfoImgServiceImpl extends ServiceImpl implements ITaskInfoImgService { +@Override +public List selectTaskInfoImgPage(Page page,QueryWrapper query) { +return this.baseMapper.selectTaskInfoImgPage(page,query); +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index bb066f4..6c9625f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotTrajectoryInfoMapper; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; @@ -34,11 +36,12 @@ public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + private final IRobotCacheService cacheService; - - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService, IRobotCacheService cacheService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; + this.cacheService = cacheService; } @Override @@ -54,14 +57,15 @@ }); //读取导航状态,如果导航未开启则不存储 - RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); - if (statusInfo != null && responseDTO.getMsg() != null) { +// RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); + Long routeId= cacheService.readRouteId(Long.valueOf(robotId)); + if (routeId != null && responseDTO.getMsg() != null) { PoseMessageResponseDTO dto = responseDTO.getMsg(); //执行循迹 保存当前轨迹信息 //更新实时定位信息 - robotStatusInfoService.updateRobotPoint(dto,robotId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId, dto); infoService.pointTestCallBack(dto, robotId); - if (statusInfo.getCurrRouteId() != null) { + if (routeId != null) { RobotTrajectoryInfo info = new RobotTrajectoryInfo(); info.setRobotId(Long.valueOf(robotId)); info.setCreateTime(new Date()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java new file mode 100644 index 0000000..a0f578e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.casic.missiles.modular.robot.service.ITaskInfoImgService; +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.casic.missiles.modular.robot.dao.TaskInfoImgMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; + + +/** + *

+ * 任务照片存储 服务实现类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +@Service +public class TaskInfoImgServiceImpl extends ServiceImpl implements ITaskInfoImgService { +@Override +public List selectTaskInfoImgPage(Page page,QueryWrapper query) { +return this.baseMapper.selectTaskInfoImgPage(page,query); +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java index 93745b6..d1417b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -6,11 +6,11 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.thread.ExecutorBuilder; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -47,6 +47,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; /** @@ -68,7 +69,10 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; private final IBaseRobotService baseRobotService; - + private final ITaskInfoImgService imgService; + /** + * 初始化线程池 + */ @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,7 +84,7 @@ @Value("${casic.obstacle:10}") private Integer obstacle; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -89,6 +93,7 @@ this.algorithmService = algorithmService; this.cacheService = cacheService; this.baseRobotService = baseRobotService; + this.imgService = imgService; } /** @@ -145,6 +150,13 @@ taskInfo.setDiscernTypeName(dictService.getDictNameByCode(RobotDictConstants.DISCERN_TYPE, taskInfo.getDiscernType() + "")); taskInfo.setTaskTypeName(dictService.getDictNameByCode(RobotDictConstants.TASK_TYPE, taskInfo.getTaskType() + "")); taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); + TaskInfoImg taskInfoImg = imgService.getById(taskInfo.getId()); + if (taskInfoImg != null) { + taskInfo.setRouteImg(taskInfoImg.getRouteImg()); + taskInfo.setPsdImg(taskInfoImg.getPsdImg()); + taskInfo.setMcaImg(taskInfoImg.getMcaImg()); + taskInfo.setHeatImg(taskInfoImg.getHeatImg()); + } //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); @@ -209,6 +221,7 @@ //清空任务缓存 robotCacheClean(robotId); + //清空机器当前任务 statusInfoService.updateCurrTask(robotId, null, null); @@ -240,6 +253,9 @@ //缓存当前点位信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; @@ -254,13 +270,25 @@ //算法初始化状态读取 Integer initValue = cacheService.readTaskInit(longId); - //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { + + try { + File file = new File("."); + File[] files = file.listFiles((dir, name) -> (name.endsWith(".png") && name.startsWith("step")) + || (name.endsWith(".txt") && name.startsWith("step")) || name.equals("repetition.txt") || name.equals("xy_train.txt") || name.equals("z_train.txt")); + if (files != null) { + for (int i = 0; i < files.length; i++) { + FileUtil.del(files[i]); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId); //中子源计数率读取 pathInitDTO.setCount(cacheService.getNeutronCount(longId)); @@ -288,7 +316,7 @@ AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); - sendWebSocket(InstructStatusMsgEnums.HEAT_MAP,robotId, response.getTaskHeatMap()); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap()); //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { @@ -329,6 +357,7 @@ RobotInfo robotInfo = cacheService.getRobotInfo(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); } @@ -426,22 +455,23 @@ * * @param imgDTO */ + @Transactional @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + TaskInfoImg infoImg = new TaskInfoImg(); if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + infoImg.setMcaImg(imgDTO.getMcaImg()); + infoImg.setHeatImg(path); } if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + infoImg.setPsdImg(imgDTO.getPsdImg()); } if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + infoImg.setRouteImg(imgDTO.getRouteImg()); } - updateWrapper.set(TaskInfo::getHeatImg, path); - updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); - update(updateWrapper); + infoImg.setId(Convert.toLong(imgDTO.getTaskId())); + imgService.saveOrUpdate(infoImg); } @SneakyThrows @@ -449,6 +479,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + wrapTaskInfo(info); RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index bb066f4..6c9625f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotTrajectoryInfoMapper; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; @@ -34,11 +36,12 @@ public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + private final IRobotCacheService cacheService; - - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService, IRobotCacheService cacheService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; + this.cacheService = cacheService; } @Override @@ -54,14 +57,15 @@ }); //读取导航状态,如果导航未开启则不存储 - RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); - if (statusInfo != null && responseDTO.getMsg() != null) { +// RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); + Long routeId= cacheService.readRouteId(Long.valueOf(robotId)); + if (routeId != null && responseDTO.getMsg() != null) { PoseMessageResponseDTO dto = responseDTO.getMsg(); //执行循迹 保存当前轨迹信息 //更新实时定位信息 - robotStatusInfoService.updateRobotPoint(dto,robotId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId, dto); infoService.pointTestCallBack(dto, robotId); - if (statusInfo.getCurrRouteId() != null) { + if (routeId != null) { RobotTrajectoryInfo info = new RobotTrajectoryInfo(); info.setRobotId(Long.valueOf(robotId)); info.setCreateTime(new Date()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java new file mode 100644 index 0000000..a0f578e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.casic.missiles.modular.robot.service.ITaskInfoImgService; +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.casic.missiles.modular.robot.dao.TaskInfoImgMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; + + +/** + *

+ * 任务照片存储 服务实现类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +@Service +public class TaskInfoImgServiceImpl extends ServiceImpl implements ITaskInfoImgService { +@Override +public List selectTaskInfoImgPage(Page page,QueryWrapper query) { +return this.baseMapper.selectTaskInfoImgPage(page,query); +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java index 93745b6..d1417b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -6,11 +6,11 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.thread.ExecutorBuilder; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -47,6 +47,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; /** @@ -68,7 +69,10 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; private final IBaseRobotService baseRobotService; - + private final ITaskInfoImgService imgService; + /** + * 初始化线程池 + */ @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,7 +84,7 @@ @Value("${casic.obstacle:10}") private Integer obstacle; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -89,6 +93,7 @@ this.algorithmService = algorithmService; this.cacheService = cacheService; this.baseRobotService = baseRobotService; + this.imgService = imgService; } /** @@ -145,6 +150,13 @@ taskInfo.setDiscernTypeName(dictService.getDictNameByCode(RobotDictConstants.DISCERN_TYPE, taskInfo.getDiscernType() + "")); taskInfo.setTaskTypeName(dictService.getDictNameByCode(RobotDictConstants.TASK_TYPE, taskInfo.getTaskType() + "")); taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); + TaskInfoImg taskInfoImg = imgService.getById(taskInfo.getId()); + if (taskInfoImg != null) { + taskInfo.setRouteImg(taskInfoImg.getRouteImg()); + taskInfo.setPsdImg(taskInfoImg.getPsdImg()); + taskInfo.setMcaImg(taskInfoImg.getMcaImg()); + taskInfo.setHeatImg(taskInfoImg.getHeatImg()); + } //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); @@ -209,6 +221,7 @@ //清空任务缓存 robotCacheClean(robotId); + //清空机器当前任务 statusInfoService.updateCurrTask(robotId, null, null); @@ -240,6 +253,9 @@ //缓存当前点位信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; @@ -254,13 +270,25 @@ //算法初始化状态读取 Integer initValue = cacheService.readTaskInit(longId); - //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { + + try { + File file = new File("."); + File[] files = file.listFiles((dir, name) -> (name.endsWith(".png") && name.startsWith("step")) + || (name.endsWith(".txt") && name.startsWith("step")) || name.equals("repetition.txt") || name.equals("xy_train.txt") || name.equals("z_train.txt")); + if (files != null) { + for (int i = 0; i < files.length; i++) { + FileUtil.del(files[i]); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId); //中子源计数率读取 pathInitDTO.setCount(cacheService.getNeutronCount(longId)); @@ -288,7 +316,7 @@ AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); - sendWebSocket(InstructStatusMsgEnums.HEAT_MAP,robotId, response.getTaskHeatMap()); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap()); //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { @@ -329,6 +357,7 @@ RobotInfo robotInfo = cacheService.getRobotInfo(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); } @@ -426,22 +455,23 @@ * * @param imgDTO */ + @Transactional @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + TaskInfoImg infoImg = new TaskInfoImg(); if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + infoImg.setMcaImg(imgDTO.getMcaImg()); + infoImg.setHeatImg(path); } if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + infoImg.setPsdImg(imgDTO.getPsdImg()); } if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + infoImg.setRouteImg(imgDTO.getRouteImg()); } - updateWrapper.set(TaskInfo::getHeatImg, path); - updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); - update(updateWrapper); + infoImg.setId(Convert.toLong(imgDTO.getTaskId())); + imgService.saveOrUpdate(infoImg); } @SneakyThrows @@ -449,6 +479,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + wrapTaskInfo(info); RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java index 75fec0e..35f1d41 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java @@ -62,7 +62,6 @@ query.eq("(a.monitor_val startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index bb066f4..6c9625f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotTrajectoryInfoMapper; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; @@ -34,11 +36,12 @@ public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + private final IRobotCacheService cacheService; - - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService, IRobotCacheService cacheService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; + this.cacheService = cacheService; } @Override @@ -54,14 +57,15 @@ }); //读取导航状态,如果导航未开启则不存储 - RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); - if (statusInfo != null && responseDTO.getMsg() != null) { +// RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); + Long routeId= cacheService.readRouteId(Long.valueOf(robotId)); + if (routeId != null && responseDTO.getMsg() != null) { PoseMessageResponseDTO dto = responseDTO.getMsg(); //执行循迹 保存当前轨迹信息 //更新实时定位信息 - robotStatusInfoService.updateRobotPoint(dto,robotId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId, dto); infoService.pointTestCallBack(dto, robotId); - if (statusInfo.getCurrRouteId() != null) { + if (routeId != null) { RobotTrajectoryInfo info = new RobotTrajectoryInfo(); info.setRobotId(Long.valueOf(robotId)); info.setCreateTime(new Date()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java new file mode 100644 index 0000000..a0f578e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.casic.missiles.modular.robot.service.ITaskInfoImgService; +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.casic.missiles.modular.robot.dao.TaskInfoImgMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; + + +/** + *

+ * 任务照片存储 服务实现类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +@Service +public class TaskInfoImgServiceImpl extends ServiceImpl implements ITaskInfoImgService { +@Override +public List selectTaskInfoImgPage(Page page,QueryWrapper query) { +return this.baseMapper.selectTaskInfoImgPage(page,query); +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java index 93745b6..d1417b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -6,11 +6,11 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.thread.ExecutorBuilder; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -47,6 +47,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; /** @@ -68,7 +69,10 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; private final IBaseRobotService baseRobotService; - + private final ITaskInfoImgService imgService; + /** + * 初始化线程池 + */ @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,7 +84,7 @@ @Value("${casic.obstacle:10}") private Integer obstacle; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -89,6 +93,7 @@ this.algorithmService = algorithmService; this.cacheService = cacheService; this.baseRobotService = baseRobotService; + this.imgService = imgService; } /** @@ -145,6 +150,13 @@ taskInfo.setDiscernTypeName(dictService.getDictNameByCode(RobotDictConstants.DISCERN_TYPE, taskInfo.getDiscernType() + "")); taskInfo.setTaskTypeName(dictService.getDictNameByCode(RobotDictConstants.TASK_TYPE, taskInfo.getTaskType() + "")); taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); + TaskInfoImg taskInfoImg = imgService.getById(taskInfo.getId()); + if (taskInfoImg != null) { + taskInfo.setRouteImg(taskInfoImg.getRouteImg()); + taskInfo.setPsdImg(taskInfoImg.getPsdImg()); + taskInfo.setMcaImg(taskInfoImg.getMcaImg()); + taskInfo.setHeatImg(taskInfoImg.getHeatImg()); + } //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); @@ -209,6 +221,7 @@ //清空任务缓存 robotCacheClean(robotId); + //清空机器当前任务 statusInfoService.updateCurrTask(robotId, null, null); @@ -240,6 +253,9 @@ //缓存当前点位信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; @@ -254,13 +270,25 @@ //算法初始化状态读取 Integer initValue = cacheService.readTaskInit(longId); - //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { + + try { + File file = new File("."); + File[] files = file.listFiles((dir, name) -> (name.endsWith(".png") && name.startsWith("step")) + || (name.endsWith(".txt") && name.startsWith("step")) || name.equals("repetition.txt") || name.equals("xy_train.txt") || name.equals("z_train.txt")); + if (files != null) { + for (int i = 0; i < files.length; i++) { + FileUtil.del(files[i]); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId); //中子源计数率读取 pathInitDTO.setCount(cacheService.getNeutronCount(longId)); @@ -288,7 +316,7 @@ AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); - sendWebSocket(InstructStatusMsgEnums.HEAT_MAP,robotId, response.getTaskHeatMap()); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap()); //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { @@ -329,6 +357,7 @@ RobotInfo robotInfo = cacheService.getRobotInfo(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); } @@ -426,22 +455,23 @@ * * @param imgDTO */ + @Transactional @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + TaskInfoImg infoImg = new TaskInfoImg(); if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + infoImg.setMcaImg(imgDTO.getMcaImg()); + infoImg.setHeatImg(path); } if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + infoImg.setPsdImg(imgDTO.getPsdImg()); } if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + infoImg.setRouteImg(imgDTO.getRouteImg()); } - updateWrapper.set(TaskInfo::getHeatImg, path); - updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); - update(updateWrapper); + infoImg.setId(Convert.toLong(imgDTO.getTaskId())); + imgService.saveOrUpdate(infoImg); } @SneakyThrows @@ -449,6 +479,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + wrapTaskInfo(info); RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java index 75fec0e..35f1d41 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java @@ -62,7 +62,6 @@ query.eq("(a.monitor_val genQuery() { +QueryWrapper query = new QueryWrapper<>(); +if (StrUtil.isNotEmpty(mcaImg)) { + query.eq("mca_img",mcaImg); +} +if (StrUtil.isNotEmpty(psdImg)) { + query.eq("psd_img",psdImg); +} +if (StrUtil.isNotEmpty(routeImg)) { + query.eq("route_img",routeImg); +} +if (StrUtil.isNotEmpty(heatImg)) { + query.eq("heat_img",heatImg); +} +return query; +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index bb066f4..6c9625f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotTrajectoryInfoMapper; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; @@ -34,11 +36,12 @@ public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + private final IRobotCacheService cacheService; - - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService, IRobotCacheService cacheService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; + this.cacheService = cacheService; } @Override @@ -54,14 +57,15 @@ }); //读取导航状态,如果导航未开启则不存储 - RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); - if (statusInfo != null && responseDTO.getMsg() != null) { +// RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); + Long routeId= cacheService.readRouteId(Long.valueOf(robotId)); + if (routeId != null && responseDTO.getMsg() != null) { PoseMessageResponseDTO dto = responseDTO.getMsg(); //执行循迹 保存当前轨迹信息 //更新实时定位信息 - robotStatusInfoService.updateRobotPoint(dto,robotId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId, dto); infoService.pointTestCallBack(dto, robotId); - if (statusInfo.getCurrRouteId() != null) { + if (routeId != null) { RobotTrajectoryInfo info = new RobotTrajectoryInfo(); info.setRobotId(Long.valueOf(robotId)); info.setCreateTime(new Date()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java new file mode 100644 index 0000000..a0f578e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.casic.missiles.modular.robot.service.ITaskInfoImgService; +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.casic.missiles.modular.robot.dao.TaskInfoImgMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; + + +/** + *

+ * 任务照片存储 服务实现类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +@Service +public class TaskInfoImgServiceImpl extends ServiceImpl implements ITaskInfoImgService { +@Override +public List selectTaskInfoImgPage(Page page,QueryWrapper query) { +return this.baseMapper.selectTaskInfoImgPage(page,query); +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java index 93745b6..d1417b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -6,11 +6,11 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.thread.ExecutorBuilder; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -47,6 +47,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; /** @@ -68,7 +69,10 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; private final IBaseRobotService baseRobotService; - + private final ITaskInfoImgService imgService; + /** + * 初始化线程池 + */ @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,7 +84,7 @@ @Value("${casic.obstacle:10}") private Integer obstacle; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -89,6 +93,7 @@ this.algorithmService = algorithmService; this.cacheService = cacheService; this.baseRobotService = baseRobotService; + this.imgService = imgService; } /** @@ -145,6 +150,13 @@ taskInfo.setDiscernTypeName(dictService.getDictNameByCode(RobotDictConstants.DISCERN_TYPE, taskInfo.getDiscernType() + "")); taskInfo.setTaskTypeName(dictService.getDictNameByCode(RobotDictConstants.TASK_TYPE, taskInfo.getTaskType() + "")); taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); + TaskInfoImg taskInfoImg = imgService.getById(taskInfo.getId()); + if (taskInfoImg != null) { + taskInfo.setRouteImg(taskInfoImg.getRouteImg()); + taskInfo.setPsdImg(taskInfoImg.getPsdImg()); + taskInfo.setMcaImg(taskInfoImg.getMcaImg()); + taskInfo.setHeatImg(taskInfoImg.getHeatImg()); + } //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); @@ -209,6 +221,7 @@ //清空任务缓存 robotCacheClean(robotId); + //清空机器当前任务 statusInfoService.updateCurrTask(robotId, null, null); @@ -240,6 +253,9 @@ //缓存当前点位信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; @@ -254,13 +270,25 @@ //算法初始化状态读取 Integer initValue = cacheService.readTaskInit(longId); - //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { + + try { + File file = new File("."); + File[] files = file.listFiles((dir, name) -> (name.endsWith(".png") && name.startsWith("step")) + || (name.endsWith(".txt") && name.startsWith("step")) || name.equals("repetition.txt") || name.equals("xy_train.txt") || name.equals("z_train.txt")); + if (files != null) { + for (int i = 0; i < files.length; i++) { + FileUtil.del(files[i]); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId); //中子源计数率读取 pathInitDTO.setCount(cacheService.getNeutronCount(longId)); @@ -288,7 +316,7 @@ AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); - sendWebSocket(InstructStatusMsgEnums.HEAT_MAP,robotId, response.getTaskHeatMap()); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap()); //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { @@ -329,6 +357,7 @@ RobotInfo robotInfo = cacheService.getRobotInfo(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); } @@ -426,22 +455,23 @@ * * @param imgDTO */ + @Transactional @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + TaskInfoImg infoImg = new TaskInfoImg(); if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + infoImg.setMcaImg(imgDTO.getMcaImg()); + infoImg.setHeatImg(path); } if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + infoImg.setPsdImg(imgDTO.getPsdImg()); } if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + infoImg.setRouteImg(imgDTO.getRouteImg()); } - updateWrapper.set(TaskInfo::getHeatImg, path); - updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); - update(updateWrapper); + infoImg.setId(Convert.toLong(imgDTO.getTaskId())); + imgService.saveOrUpdate(infoImg); } @SneakyThrows @@ -449,6 +479,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + wrapTaskInfo(info); RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java index 75fec0e..35f1d41 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java @@ -62,7 +62,6 @@ query.eq("(a.monitor_val genQuery() { +QueryWrapper query = new QueryWrapper<>(); +if (StrUtil.isNotEmpty(mcaImg)) { + query.eq("mca_img",mcaImg); +} +if (StrUtil.isNotEmpty(psdImg)) { + query.eq("psd_img",psdImg); +} +if (StrUtil.isNotEmpty(routeImg)) { + query.eq("route_img",routeImg); +} +if (StrUtil.isNotEmpty(heatImg)) { + query.eq("heat_img",heatImg); +} +return query; +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java deleted file mode 100644 index 99c4a6f..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.modular.system.controller; - - -import com.casic.missiles.model.response.ResponseData; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -/** - * @ClassName DemoController - * @Description TODO - * @Author lenovo - * @Date 2020/6/13 15:38 - * @Version 1.0 - */ -@RestController -@RequestMapping("/demo") -public class DemoController { - - - /** - * 获取mockToken - */ - @PostMapping("/test") - @ResponseBody - public Object testMqtt(String topic, String msg) { - - return ResponseData.success(); - } -} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index bb066f4..6c9625f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotTrajectoryInfoMapper; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; @@ -34,11 +36,12 @@ public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + private final IRobotCacheService cacheService; - - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService, IRobotCacheService cacheService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; + this.cacheService = cacheService; } @Override @@ -54,14 +57,15 @@ }); //读取导航状态,如果导航未开启则不存储 - RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); - if (statusInfo != null && responseDTO.getMsg() != null) { +// RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); + Long routeId= cacheService.readRouteId(Long.valueOf(robotId)); + if (routeId != null && responseDTO.getMsg() != null) { PoseMessageResponseDTO dto = responseDTO.getMsg(); //执行循迹 保存当前轨迹信息 //更新实时定位信息 - robotStatusInfoService.updateRobotPoint(dto,robotId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId, dto); infoService.pointTestCallBack(dto, robotId); - if (statusInfo.getCurrRouteId() != null) { + if (routeId != null) { RobotTrajectoryInfo info = new RobotTrajectoryInfo(); info.setRobotId(Long.valueOf(robotId)); info.setCreateTime(new Date()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java new file mode 100644 index 0000000..a0f578e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.casic.missiles.modular.robot.service.ITaskInfoImgService; +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.casic.missiles.modular.robot.dao.TaskInfoImgMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; + + +/** + *

+ * 任务照片存储 服务实现类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +@Service +public class TaskInfoImgServiceImpl extends ServiceImpl implements ITaskInfoImgService { +@Override +public List selectTaskInfoImgPage(Page page,QueryWrapper query) { +return this.baseMapper.selectTaskInfoImgPage(page,query); +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java index 93745b6..d1417b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -6,11 +6,11 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.thread.ExecutorBuilder; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -47,6 +47,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; /** @@ -68,7 +69,10 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; private final IBaseRobotService baseRobotService; - + private final ITaskInfoImgService imgService; + /** + * 初始化线程池 + */ @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,7 +84,7 @@ @Value("${casic.obstacle:10}") private Integer obstacle; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -89,6 +93,7 @@ this.algorithmService = algorithmService; this.cacheService = cacheService; this.baseRobotService = baseRobotService; + this.imgService = imgService; } /** @@ -145,6 +150,13 @@ taskInfo.setDiscernTypeName(dictService.getDictNameByCode(RobotDictConstants.DISCERN_TYPE, taskInfo.getDiscernType() + "")); taskInfo.setTaskTypeName(dictService.getDictNameByCode(RobotDictConstants.TASK_TYPE, taskInfo.getTaskType() + "")); taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); + TaskInfoImg taskInfoImg = imgService.getById(taskInfo.getId()); + if (taskInfoImg != null) { + taskInfo.setRouteImg(taskInfoImg.getRouteImg()); + taskInfo.setPsdImg(taskInfoImg.getPsdImg()); + taskInfo.setMcaImg(taskInfoImg.getMcaImg()); + taskInfo.setHeatImg(taskInfoImg.getHeatImg()); + } //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); @@ -209,6 +221,7 @@ //清空任务缓存 robotCacheClean(robotId); + //清空机器当前任务 statusInfoService.updateCurrTask(robotId, null, null); @@ -240,6 +253,9 @@ //缓存当前点位信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; @@ -254,13 +270,25 @@ //算法初始化状态读取 Integer initValue = cacheService.readTaskInit(longId); - //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { + + try { + File file = new File("."); + File[] files = file.listFiles((dir, name) -> (name.endsWith(".png") && name.startsWith("step")) + || (name.endsWith(".txt") && name.startsWith("step")) || name.equals("repetition.txt") || name.equals("xy_train.txt") || name.equals("z_train.txt")); + if (files != null) { + for (int i = 0; i < files.length; i++) { + FileUtil.del(files[i]); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId); //中子源计数率读取 pathInitDTO.setCount(cacheService.getNeutronCount(longId)); @@ -288,7 +316,7 @@ AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); - sendWebSocket(InstructStatusMsgEnums.HEAT_MAP,robotId, response.getTaskHeatMap()); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap()); //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { @@ -329,6 +357,7 @@ RobotInfo robotInfo = cacheService.getRobotInfo(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); } @@ -426,22 +455,23 @@ * * @param imgDTO */ + @Transactional @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + TaskInfoImg infoImg = new TaskInfoImg(); if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + infoImg.setMcaImg(imgDTO.getMcaImg()); + infoImg.setHeatImg(path); } if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + infoImg.setPsdImg(imgDTO.getPsdImg()); } if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + infoImg.setRouteImg(imgDTO.getRouteImg()); } - updateWrapper.set(TaskInfo::getHeatImg, path); - updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); - update(updateWrapper); + infoImg.setId(Convert.toLong(imgDTO.getTaskId())); + imgService.saveOrUpdate(infoImg); } @SneakyThrows @@ -449,6 +479,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + wrapTaskInfo(info); RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java index 75fec0e..35f1d41 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java @@ -62,7 +62,6 @@ query.eq("(a.monitor_val genQuery() { +QueryWrapper query = new QueryWrapper<>(); +if (StrUtil.isNotEmpty(mcaImg)) { + query.eq("mca_img",mcaImg); +} +if (StrUtil.isNotEmpty(psdImg)) { + query.eq("psd_img",psdImg); +} +if (StrUtil.isNotEmpty(routeImg)) { + query.eq("route_img",routeImg); +} +if (StrUtil.isNotEmpty(heatImg)) { + query.eq("heat_img",heatImg); +} +return query; +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java deleted file mode 100644 index 99c4a6f..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.modular.system.controller; - - -import com.casic.missiles.model.response.ResponseData; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -/** - * @ClassName DemoController - * @Description TODO - * @Author lenovo - * @Date 2020/6/13 15:38 - * @Version 1.0 - */ -@RestController -@RequestMapping("/demo") -public class DemoController { - - - /** - * 获取mockToken - */ - @PostMapping("/test") - @ResponseBody - public Object testMqtt(String topic, String msg) { - - return ResponseData.success(); - } -} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java deleted file mode 100644 index c6ed867..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.modular.system.event; - -import com.casic.missiles.model.application.event.core.ModelEvent; -import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; -import com.casic.missiles.modular.system.model.User; - -/** - * 用户事件 - * - * @author lwh - */ -public class UserEvent extends ModelEvent { - /** - * Create a new {@code ApplicationEvent}. - * - * @param type 事件类型 - * @param source the object on which the event initially occurred or with - * which the event is associated (never {@code null}) - */ - public UserEvent(AbstractEventTypeEnum type, User source) { - super(type, source); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index bb066f4..6c9625f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotTrajectoryInfoMapper; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; @@ -34,11 +36,12 @@ public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + private final IRobotCacheService cacheService; - - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService, IRobotCacheService cacheService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; + this.cacheService = cacheService; } @Override @@ -54,14 +57,15 @@ }); //读取导航状态,如果导航未开启则不存储 - RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); - if (statusInfo != null && responseDTO.getMsg() != null) { +// RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); + Long routeId= cacheService.readRouteId(Long.valueOf(robotId)); + if (routeId != null && responseDTO.getMsg() != null) { PoseMessageResponseDTO dto = responseDTO.getMsg(); //执行循迹 保存当前轨迹信息 //更新实时定位信息 - robotStatusInfoService.updateRobotPoint(dto,robotId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId, dto); infoService.pointTestCallBack(dto, robotId); - if (statusInfo.getCurrRouteId() != null) { + if (routeId != null) { RobotTrajectoryInfo info = new RobotTrajectoryInfo(); info.setRobotId(Long.valueOf(robotId)); info.setCreateTime(new Date()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java new file mode 100644 index 0000000..a0f578e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.casic.missiles.modular.robot.service.ITaskInfoImgService; +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.casic.missiles.modular.robot.dao.TaskInfoImgMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; + + +/** + *

+ * 任务照片存储 服务实现类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +@Service +public class TaskInfoImgServiceImpl extends ServiceImpl implements ITaskInfoImgService { +@Override +public List selectTaskInfoImgPage(Page page,QueryWrapper query) { +return this.baseMapper.selectTaskInfoImgPage(page,query); +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java index 93745b6..d1417b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -6,11 +6,11 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.thread.ExecutorBuilder; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -47,6 +47,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; /** @@ -68,7 +69,10 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; private final IBaseRobotService baseRobotService; - + private final ITaskInfoImgService imgService; + /** + * 初始化线程池 + */ @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,7 +84,7 @@ @Value("${casic.obstacle:10}") private Integer obstacle; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -89,6 +93,7 @@ this.algorithmService = algorithmService; this.cacheService = cacheService; this.baseRobotService = baseRobotService; + this.imgService = imgService; } /** @@ -145,6 +150,13 @@ taskInfo.setDiscernTypeName(dictService.getDictNameByCode(RobotDictConstants.DISCERN_TYPE, taskInfo.getDiscernType() + "")); taskInfo.setTaskTypeName(dictService.getDictNameByCode(RobotDictConstants.TASK_TYPE, taskInfo.getTaskType() + "")); taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); + TaskInfoImg taskInfoImg = imgService.getById(taskInfo.getId()); + if (taskInfoImg != null) { + taskInfo.setRouteImg(taskInfoImg.getRouteImg()); + taskInfo.setPsdImg(taskInfoImg.getPsdImg()); + taskInfo.setMcaImg(taskInfoImg.getMcaImg()); + taskInfo.setHeatImg(taskInfoImg.getHeatImg()); + } //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); @@ -209,6 +221,7 @@ //清空任务缓存 robotCacheClean(robotId); + //清空机器当前任务 statusInfoService.updateCurrTask(robotId, null, null); @@ -240,6 +253,9 @@ //缓存当前点位信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; @@ -254,13 +270,25 @@ //算法初始化状态读取 Integer initValue = cacheService.readTaskInit(longId); - //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { + + try { + File file = new File("."); + File[] files = file.listFiles((dir, name) -> (name.endsWith(".png") && name.startsWith("step")) + || (name.endsWith(".txt") && name.startsWith("step")) || name.equals("repetition.txt") || name.equals("xy_train.txt") || name.equals("z_train.txt")); + if (files != null) { + for (int i = 0; i < files.length; i++) { + FileUtil.del(files[i]); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId); //中子源计数率读取 pathInitDTO.setCount(cacheService.getNeutronCount(longId)); @@ -288,7 +316,7 @@ AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); - sendWebSocket(InstructStatusMsgEnums.HEAT_MAP,robotId, response.getTaskHeatMap()); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap()); //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { @@ -329,6 +357,7 @@ RobotInfo robotInfo = cacheService.getRobotInfo(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); } @@ -426,22 +455,23 @@ * * @param imgDTO */ + @Transactional @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + TaskInfoImg infoImg = new TaskInfoImg(); if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + infoImg.setMcaImg(imgDTO.getMcaImg()); + infoImg.setHeatImg(path); } if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + infoImg.setPsdImg(imgDTO.getPsdImg()); } if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + infoImg.setRouteImg(imgDTO.getRouteImg()); } - updateWrapper.set(TaskInfo::getHeatImg, path); - updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); - update(updateWrapper); + infoImg.setId(Convert.toLong(imgDTO.getTaskId())); + imgService.saveOrUpdate(infoImg); } @SneakyThrows @@ -449,6 +479,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + wrapTaskInfo(info); RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java index 75fec0e..35f1d41 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java @@ -62,7 +62,6 @@ query.eq("(a.monitor_val genQuery() { +QueryWrapper query = new QueryWrapper<>(); +if (StrUtil.isNotEmpty(mcaImg)) { + query.eq("mca_img",mcaImg); +} +if (StrUtil.isNotEmpty(psdImg)) { + query.eq("psd_img",psdImg); +} +if (StrUtil.isNotEmpty(routeImg)) { + query.eq("route_img",routeImg); +} +if (StrUtil.isNotEmpty(heatImg)) { + query.eq("heat_img",heatImg); +} +return query; +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java deleted file mode 100644 index 99c4a6f..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.modular.system.controller; - - -import com.casic.missiles.model.response.ResponseData; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -/** - * @ClassName DemoController - * @Description TODO - * @Author lenovo - * @Date 2020/6/13 15:38 - * @Version 1.0 - */ -@RestController -@RequestMapping("/demo") -public class DemoController { - - - /** - * 获取mockToken - */ - @PostMapping("/test") - @ResponseBody - public Object testMqtt(String topic, String msg) { - - return ResponseData.success(); - } -} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java deleted file mode 100644 index c6ed867..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.modular.system.event; - -import com.casic.missiles.model.application.event.core.ModelEvent; -import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; -import com.casic.missiles.modular.system.model.User; - -/** - * 用户事件 - * - * @author lwh - */ -public class UserEvent extends ModelEvent { - /** - * Create a new {@code ApplicationEvent}. - * - * @param type 事件类型 - * @param source the object on which the event initially occurred or with - * which the event is associated (never {@code null}) - */ - public UserEvent(AbstractEventTypeEnum type, User source) { - super(type, source); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java deleted file mode 100644 index 4480ef2..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.modular.system.event.listener; - -import com.casic.missiles.core.application.event.UserLoginEvent; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -/** - * 用户事件订阅 - * - * @author lwh - */ -@Slf4j -@Component -public class UserOneListener { - @EventListener - public void onApplicationEvent(UserLoginEvent event) { - log.debug("用户1订阅:{}", event); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index bb066f4..6c9625f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotTrajectoryInfoMapper; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; @@ -34,11 +36,12 @@ public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + private final IRobotCacheService cacheService; - - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService, IRobotCacheService cacheService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; + this.cacheService = cacheService; } @Override @@ -54,14 +57,15 @@ }); //读取导航状态,如果导航未开启则不存储 - RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); - if (statusInfo != null && responseDTO.getMsg() != null) { +// RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); + Long routeId= cacheService.readRouteId(Long.valueOf(robotId)); + if (routeId != null && responseDTO.getMsg() != null) { PoseMessageResponseDTO dto = responseDTO.getMsg(); //执行循迹 保存当前轨迹信息 //更新实时定位信息 - robotStatusInfoService.updateRobotPoint(dto,robotId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId, dto); infoService.pointTestCallBack(dto, robotId); - if (statusInfo.getCurrRouteId() != null) { + if (routeId != null) { RobotTrajectoryInfo info = new RobotTrajectoryInfo(); info.setRobotId(Long.valueOf(robotId)); info.setCreateTime(new Date()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java new file mode 100644 index 0000000..a0f578e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.casic.missiles.modular.robot.service.ITaskInfoImgService; +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.casic.missiles.modular.robot.dao.TaskInfoImgMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; + + +/** + *

+ * 任务照片存储 服务实现类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +@Service +public class TaskInfoImgServiceImpl extends ServiceImpl implements ITaskInfoImgService { +@Override +public List selectTaskInfoImgPage(Page page,QueryWrapper query) { +return this.baseMapper.selectTaskInfoImgPage(page,query); +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java index 93745b6..d1417b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -6,11 +6,11 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.thread.ExecutorBuilder; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -47,6 +47,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; /** @@ -68,7 +69,10 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; private final IBaseRobotService baseRobotService; - + private final ITaskInfoImgService imgService; + /** + * 初始化线程池 + */ @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,7 +84,7 @@ @Value("${casic.obstacle:10}") private Integer obstacle; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -89,6 +93,7 @@ this.algorithmService = algorithmService; this.cacheService = cacheService; this.baseRobotService = baseRobotService; + this.imgService = imgService; } /** @@ -145,6 +150,13 @@ taskInfo.setDiscernTypeName(dictService.getDictNameByCode(RobotDictConstants.DISCERN_TYPE, taskInfo.getDiscernType() + "")); taskInfo.setTaskTypeName(dictService.getDictNameByCode(RobotDictConstants.TASK_TYPE, taskInfo.getTaskType() + "")); taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); + TaskInfoImg taskInfoImg = imgService.getById(taskInfo.getId()); + if (taskInfoImg != null) { + taskInfo.setRouteImg(taskInfoImg.getRouteImg()); + taskInfo.setPsdImg(taskInfoImg.getPsdImg()); + taskInfo.setMcaImg(taskInfoImg.getMcaImg()); + taskInfo.setHeatImg(taskInfoImg.getHeatImg()); + } //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); @@ -209,6 +221,7 @@ //清空任务缓存 robotCacheClean(robotId); + //清空机器当前任务 statusInfoService.updateCurrTask(robotId, null, null); @@ -240,6 +253,9 @@ //缓存当前点位信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; @@ -254,13 +270,25 @@ //算法初始化状态读取 Integer initValue = cacheService.readTaskInit(longId); - //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { + + try { + File file = new File("."); + File[] files = file.listFiles((dir, name) -> (name.endsWith(".png") && name.startsWith("step")) + || (name.endsWith(".txt") && name.startsWith("step")) || name.equals("repetition.txt") || name.equals("xy_train.txt") || name.equals("z_train.txt")); + if (files != null) { + for (int i = 0; i < files.length; i++) { + FileUtil.del(files[i]); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId); //中子源计数率读取 pathInitDTO.setCount(cacheService.getNeutronCount(longId)); @@ -288,7 +316,7 @@ AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); - sendWebSocket(InstructStatusMsgEnums.HEAT_MAP,robotId, response.getTaskHeatMap()); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap()); //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { @@ -329,6 +357,7 @@ RobotInfo robotInfo = cacheService.getRobotInfo(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); } @@ -426,22 +455,23 @@ * * @param imgDTO */ + @Transactional @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + TaskInfoImg infoImg = new TaskInfoImg(); if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + infoImg.setMcaImg(imgDTO.getMcaImg()); + infoImg.setHeatImg(path); } if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + infoImg.setPsdImg(imgDTO.getPsdImg()); } if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + infoImg.setRouteImg(imgDTO.getRouteImg()); } - updateWrapper.set(TaskInfo::getHeatImg, path); - updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); - update(updateWrapper); + infoImg.setId(Convert.toLong(imgDTO.getTaskId())); + imgService.saveOrUpdate(infoImg); } @SneakyThrows @@ -449,6 +479,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + wrapTaskInfo(info); RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java index 75fec0e..35f1d41 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java @@ -62,7 +62,6 @@ query.eq("(a.monitor_val genQuery() { +QueryWrapper query = new QueryWrapper<>(); +if (StrUtil.isNotEmpty(mcaImg)) { + query.eq("mca_img",mcaImg); +} +if (StrUtil.isNotEmpty(psdImg)) { + query.eq("psd_img",psdImg); +} +if (StrUtil.isNotEmpty(routeImg)) { + query.eq("route_img",routeImg); +} +if (StrUtil.isNotEmpty(heatImg)) { + query.eq("heat_img",heatImg); +} +return query; +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java deleted file mode 100644 index 99c4a6f..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.modular.system.controller; - - -import com.casic.missiles.model.response.ResponseData; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -/** - * @ClassName DemoController - * @Description TODO - * @Author lenovo - * @Date 2020/6/13 15:38 - * @Version 1.0 - */ -@RestController -@RequestMapping("/demo") -public class DemoController { - - - /** - * 获取mockToken - */ - @PostMapping("/test") - @ResponseBody - public Object testMqtt(String topic, String msg) { - - return ResponseData.success(); - } -} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java deleted file mode 100644 index c6ed867..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.modular.system.event; - -import com.casic.missiles.model.application.event.core.ModelEvent; -import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; -import com.casic.missiles.modular.system.model.User; - -/** - * 用户事件 - * - * @author lwh - */ -public class UserEvent extends ModelEvent { - /** - * Create a new {@code ApplicationEvent}. - * - * @param type 事件类型 - * @param source the object on which the event initially occurred or with - * which the event is associated (never {@code null}) - */ - public UserEvent(AbstractEventTypeEnum type, User source) { - super(type, source); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java deleted file mode 100644 index 4480ef2..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.modular.system.event.listener; - -import com.casic.missiles.core.application.event.UserLoginEvent; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -/** - * 用户事件订阅 - * - * @author lwh - */ -@Slf4j -@Component -public class UserOneListener { - @EventListener - public void onApplicationEvent(UserLoginEvent event) { - log.debug("用户1订阅:{}", event); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java deleted file mode 100644 index 8447a22..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.modular.system.event.listener; - -import com.casic.missiles.model.application.event.core.EventSubscriber; -import com.casic.missiles.modular.system.event.UserEvent; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * 用户事件订阅 - * - * @author lwh - */ -@Slf4j -@Component -public class UserTwoListener extends EventSubscriber { - @Override - public void onApplicationEvent(UserEvent event) { - log.debug("用户2订阅:{}", event); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index bb066f4..6c9625f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotTrajectoryInfoMapper; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; @@ -34,11 +36,12 @@ public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + private final IRobotCacheService cacheService; - - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService, IRobotCacheService cacheService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; + this.cacheService = cacheService; } @Override @@ -54,14 +57,15 @@ }); //读取导航状态,如果导航未开启则不存储 - RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); - if (statusInfo != null && responseDTO.getMsg() != null) { +// RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); + Long routeId= cacheService.readRouteId(Long.valueOf(robotId)); + if (routeId != null && responseDTO.getMsg() != null) { PoseMessageResponseDTO dto = responseDTO.getMsg(); //执行循迹 保存当前轨迹信息 //更新实时定位信息 - robotStatusInfoService.updateRobotPoint(dto,robotId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId, dto); infoService.pointTestCallBack(dto, robotId); - if (statusInfo.getCurrRouteId() != null) { + if (routeId != null) { RobotTrajectoryInfo info = new RobotTrajectoryInfo(); info.setRobotId(Long.valueOf(robotId)); info.setCreateTime(new Date()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java new file mode 100644 index 0000000..a0f578e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.casic.missiles.modular.robot.service.ITaskInfoImgService; +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.casic.missiles.modular.robot.dao.TaskInfoImgMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; + + +/** + *

+ * 任务照片存储 服务实现类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +@Service +public class TaskInfoImgServiceImpl extends ServiceImpl implements ITaskInfoImgService { +@Override +public List selectTaskInfoImgPage(Page page,QueryWrapper query) { +return this.baseMapper.selectTaskInfoImgPage(page,query); +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java index 93745b6..d1417b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -6,11 +6,11 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.thread.ExecutorBuilder; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -47,6 +47,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; /** @@ -68,7 +69,10 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; private final IBaseRobotService baseRobotService; - + private final ITaskInfoImgService imgService; + /** + * 初始化线程池 + */ @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,7 +84,7 @@ @Value("${casic.obstacle:10}") private Integer obstacle; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -89,6 +93,7 @@ this.algorithmService = algorithmService; this.cacheService = cacheService; this.baseRobotService = baseRobotService; + this.imgService = imgService; } /** @@ -145,6 +150,13 @@ taskInfo.setDiscernTypeName(dictService.getDictNameByCode(RobotDictConstants.DISCERN_TYPE, taskInfo.getDiscernType() + "")); taskInfo.setTaskTypeName(dictService.getDictNameByCode(RobotDictConstants.TASK_TYPE, taskInfo.getTaskType() + "")); taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); + TaskInfoImg taskInfoImg = imgService.getById(taskInfo.getId()); + if (taskInfoImg != null) { + taskInfo.setRouteImg(taskInfoImg.getRouteImg()); + taskInfo.setPsdImg(taskInfoImg.getPsdImg()); + taskInfo.setMcaImg(taskInfoImg.getMcaImg()); + taskInfo.setHeatImg(taskInfoImg.getHeatImg()); + } //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); @@ -209,6 +221,7 @@ //清空任务缓存 robotCacheClean(robotId); + //清空机器当前任务 statusInfoService.updateCurrTask(robotId, null, null); @@ -240,6 +253,9 @@ //缓存当前点位信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; @@ -254,13 +270,25 @@ //算法初始化状态读取 Integer initValue = cacheService.readTaskInit(longId); - //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { + + try { + File file = new File("."); + File[] files = file.listFiles((dir, name) -> (name.endsWith(".png") && name.startsWith("step")) + || (name.endsWith(".txt") && name.startsWith("step")) || name.equals("repetition.txt") || name.equals("xy_train.txt") || name.equals("z_train.txt")); + if (files != null) { + for (int i = 0; i < files.length; i++) { + FileUtil.del(files[i]); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId); //中子源计数率读取 pathInitDTO.setCount(cacheService.getNeutronCount(longId)); @@ -288,7 +316,7 @@ AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); - sendWebSocket(InstructStatusMsgEnums.HEAT_MAP,robotId, response.getTaskHeatMap()); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap()); //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { @@ -329,6 +357,7 @@ RobotInfo robotInfo = cacheService.getRobotInfo(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); } @@ -426,22 +455,23 @@ * * @param imgDTO */ + @Transactional @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + TaskInfoImg infoImg = new TaskInfoImg(); if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + infoImg.setMcaImg(imgDTO.getMcaImg()); + infoImg.setHeatImg(path); } if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + infoImg.setPsdImg(imgDTO.getPsdImg()); } if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + infoImg.setRouteImg(imgDTO.getRouteImg()); } - updateWrapper.set(TaskInfo::getHeatImg, path); - updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); - update(updateWrapper); + infoImg.setId(Convert.toLong(imgDTO.getTaskId())); + imgService.saveOrUpdate(infoImg); } @SneakyThrows @@ -449,6 +479,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + wrapTaskInfo(info); RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java index 75fec0e..35f1d41 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java @@ -62,7 +62,6 @@ query.eq("(a.monitor_val genQuery() { +QueryWrapper query = new QueryWrapper<>(); +if (StrUtil.isNotEmpty(mcaImg)) { + query.eq("mca_img",mcaImg); +} +if (StrUtil.isNotEmpty(psdImg)) { + query.eq("psd_img",psdImg); +} +if (StrUtil.isNotEmpty(routeImg)) { + query.eq("route_img",routeImg); +} +if (StrUtil.isNotEmpty(heatImg)) { + query.eq("heat_img",heatImg); +} +return query; +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java deleted file mode 100644 index 99c4a6f..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.modular.system.controller; - - -import com.casic.missiles.model.response.ResponseData; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -/** - * @ClassName DemoController - * @Description TODO - * @Author lenovo - * @Date 2020/6/13 15:38 - * @Version 1.0 - */ -@RestController -@RequestMapping("/demo") -public class DemoController { - - - /** - * 获取mockToken - */ - @PostMapping("/test") - @ResponseBody - public Object testMqtt(String topic, String msg) { - - return ResponseData.success(); - } -} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java deleted file mode 100644 index c6ed867..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.modular.system.event; - -import com.casic.missiles.model.application.event.core.ModelEvent; -import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; -import com.casic.missiles.modular.system.model.User; - -/** - * 用户事件 - * - * @author lwh - */ -public class UserEvent extends ModelEvent { - /** - * Create a new {@code ApplicationEvent}. - * - * @param type 事件类型 - * @param source the object on which the event initially occurred or with - * which the event is associated (never {@code null}) - */ - public UserEvent(AbstractEventTypeEnum type, User source) { - super(type, source); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java deleted file mode 100644 index 4480ef2..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.modular.system.event.listener; - -import com.casic.missiles.core.application.event.UserLoginEvent; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -/** - * 用户事件订阅 - * - * @author lwh - */ -@Slf4j -@Component -public class UserOneListener { - @EventListener - public void onApplicationEvent(UserLoginEvent event) { - log.debug("用户1订阅:{}", event); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java deleted file mode 100644 index 8447a22..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.modular.system.event.listener; - -import com.casic.missiles.model.application.event.core.EventSubscriber; -import com.casic.missiles.modular.system.event.UserEvent; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * 用户事件订阅 - * - * @author lwh - */ -@Slf4j -@Component -public class UserTwoListener extends EventSubscriber { - @Override - public void onApplicationEvent(UserEvent event) { - log.debug("用户2订阅:{}", event); - } -} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 627e36f..01be493 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -57,6 +57,7 @@ + org.springframework.boot spring-boot-starter-jdbc @@ -68,6 +69,11 @@ ${core.version} + io.swagger + swagger-models + 1.6.0 + + com.casic casic-admin-core ${admin.version} @@ -76,6 +82,10 @@ io.springfox springfox-swagger-ui + + io.swagger + swagger-models + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index bb066f4..6c9625f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotTrajectoryInfoMapper; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; @@ -34,11 +36,12 @@ public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + private final IRobotCacheService cacheService; - - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService, IRobotCacheService cacheService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; + this.cacheService = cacheService; } @Override @@ -54,14 +57,15 @@ }); //读取导航状态,如果导航未开启则不存储 - RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); - if (statusInfo != null && responseDTO.getMsg() != null) { +// RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); + Long routeId= cacheService.readRouteId(Long.valueOf(robotId)); + if (routeId != null && responseDTO.getMsg() != null) { PoseMessageResponseDTO dto = responseDTO.getMsg(); //执行循迹 保存当前轨迹信息 //更新实时定位信息 - robotStatusInfoService.updateRobotPoint(dto,robotId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId, dto); infoService.pointTestCallBack(dto, robotId); - if (statusInfo.getCurrRouteId() != null) { + if (routeId != null) { RobotTrajectoryInfo info = new RobotTrajectoryInfo(); info.setRobotId(Long.valueOf(robotId)); info.setCreateTime(new Date()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java new file mode 100644 index 0000000..a0f578e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.casic.missiles.modular.robot.service.ITaskInfoImgService; +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.casic.missiles.modular.robot.dao.TaskInfoImgMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; + + +/** + *

+ * 任务照片存储 服务实现类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +@Service +public class TaskInfoImgServiceImpl extends ServiceImpl implements ITaskInfoImgService { +@Override +public List selectTaskInfoImgPage(Page page,QueryWrapper query) { +return this.baseMapper.selectTaskInfoImgPage(page,query); +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java index 93745b6..d1417b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -6,11 +6,11 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.thread.ExecutorBuilder; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -47,6 +47,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; /** @@ -68,7 +69,10 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; private final IBaseRobotService baseRobotService; - + private final ITaskInfoImgService imgService; + /** + * 初始化线程池 + */ @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,7 +84,7 @@ @Value("${casic.obstacle:10}") private Integer obstacle; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -89,6 +93,7 @@ this.algorithmService = algorithmService; this.cacheService = cacheService; this.baseRobotService = baseRobotService; + this.imgService = imgService; } /** @@ -145,6 +150,13 @@ taskInfo.setDiscernTypeName(dictService.getDictNameByCode(RobotDictConstants.DISCERN_TYPE, taskInfo.getDiscernType() + "")); taskInfo.setTaskTypeName(dictService.getDictNameByCode(RobotDictConstants.TASK_TYPE, taskInfo.getTaskType() + "")); taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); + TaskInfoImg taskInfoImg = imgService.getById(taskInfo.getId()); + if (taskInfoImg != null) { + taskInfo.setRouteImg(taskInfoImg.getRouteImg()); + taskInfo.setPsdImg(taskInfoImg.getPsdImg()); + taskInfo.setMcaImg(taskInfoImg.getMcaImg()); + taskInfo.setHeatImg(taskInfoImg.getHeatImg()); + } //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); @@ -209,6 +221,7 @@ //清空任务缓存 robotCacheClean(robotId); + //清空机器当前任务 statusInfoService.updateCurrTask(robotId, null, null); @@ -240,6 +253,9 @@ //缓存当前点位信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; @@ -254,13 +270,25 @@ //算法初始化状态读取 Integer initValue = cacheService.readTaskInit(longId); - //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { + + try { + File file = new File("."); + File[] files = file.listFiles((dir, name) -> (name.endsWith(".png") && name.startsWith("step")) + || (name.endsWith(".txt") && name.startsWith("step")) || name.equals("repetition.txt") || name.equals("xy_train.txt") || name.equals("z_train.txt")); + if (files != null) { + for (int i = 0; i < files.length; i++) { + FileUtil.del(files[i]); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId); //中子源计数率读取 pathInitDTO.setCount(cacheService.getNeutronCount(longId)); @@ -288,7 +316,7 @@ AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); - sendWebSocket(InstructStatusMsgEnums.HEAT_MAP,robotId, response.getTaskHeatMap()); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap()); //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { @@ -329,6 +357,7 @@ RobotInfo robotInfo = cacheService.getRobotInfo(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); } @@ -426,22 +455,23 @@ * * @param imgDTO */ + @Transactional @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + TaskInfoImg infoImg = new TaskInfoImg(); if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + infoImg.setMcaImg(imgDTO.getMcaImg()); + infoImg.setHeatImg(path); } if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + infoImg.setPsdImg(imgDTO.getPsdImg()); } if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + infoImg.setRouteImg(imgDTO.getRouteImg()); } - updateWrapper.set(TaskInfo::getHeatImg, path); - updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); - update(updateWrapper); + infoImg.setId(Convert.toLong(imgDTO.getTaskId())); + imgService.saveOrUpdate(infoImg); } @SneakyThrows @@ -449,6 +479,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + wrapTaskInfo(info); RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java index 75fec0e..35f1d41 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java @@ -62,7 +62,6 @@ query.eq("(a.monitor_val genQuery() { +QueryWrapper query = new QueryWrapper<>(); +if (StrUtil.isNotEmpty(mcaImg)) { + query.eq("mca_img",mcaImg); +} +if (StrUtil.isNotEmpty(psdImg)) { + query.eq("psd_img",psdImg); +} +if (StrUtil.isNotEmpty(routeImg)) { + query.eq("route_img",routeImg); +} +if (StrUtil.isNotEmpty(heatImg)) { + query.eq("heat_img",heatImg); +} +return query; +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java deleted file mode 100644 index 99c4a6f..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.modular.system.controller; - - -import com.casic.missiles.model.response.ResponseData; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -/** - * @ClassName DemoController - * @Description TODO - * @Author lenovo - * @Date 2020/6/13 15:38 - * @Version 1.0 - */ -@RestController -@RequestMapping("/demo") -public class DemoController { - - - /** - * 获取mockToken - */ - @PostMapping("/test") - @ResponseBody - public Object testMqtt(String topic, String msg) { - - return ResponseData.success(); - } -} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java deleted file mode 100644 index c6ed867..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.modular.system.event; - -import com.casic.missiles.model.application.event.core.ModelEvent; -import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; -import com.casic.missiles.modular.system.model.User; - -/** - * 用户事件 - * - * @author lwh - */ -public class UserEvent extends ModelEvent { - /** - * Create a new {@code ApplicationEvent}. - * - * @param type 事件类型 - * @param source the object on which the event initially occurred or with - * which the event is associated (never {@code null}) - */ - public UserEvent(AbstractEventTypeEnum type, User source) { - super(type, source); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java deleted file mode 100644 index 4480ef2..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.modular.system.event.listener; - -import com.casic.missiles.core.application.event.UserLoginEvent; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -/** - * 用户事件订阅 - * - * @author lwh - */ -@Slf4j -@Component -public class UserOneListener { - @EventListener - public void onApplicationEvent(UserLoginEvent event) { - log.debug("用户1订阅:{}", event); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java deleted file mode 100644 index 8447a22..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.modular.system.event.listener; - -import com.casic.missiles.model.application.event.core.EventSubscriber; -import com.casic.missiles.modular.system.event.UserEvent; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * 用户事件订阅 - * - * @author lwh - */ -@Slf4j -@Component -public class UserTwoListener extends EventSubscriber { - @Override - public void onApplicationEvent(UserEvent event) { - log.debug("用户2订阅:{}", event); - } -} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 627e36f..01be493 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -57,6 +57,7 @@
+ org.springframework.boot spring-boot-starter-jdbc @@ -68,6 +69,11 @@ ${core.version} + io.swagger + swagger-models + 1.6.0 + + com.casic casic-admin-core ${admin.version} @@ -76,6 +82,10 @@ io.springfox springfox-swagger-ui + + io.swagger + swagger-models + diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 3d8ae29..fa44b21 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -6,7 +6,7 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://192.168.1.41:3000/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root - password: root + password: 123456 jms: pub-sub-domain: true # session: diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index bb066f4..6c9625f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotTrajectoryInfoMapper; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; @@ -34,11 +36,12 @@ public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + private final IRobotCacheService cacheService; - - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService, IRobotCacheService cacheService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; + this.cacheService = cacheService; } @Override @@ -54,14 +57,15 @@ }); //读取导航状态,如果导航未开启则不存储 - RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); - if (statusInfo != null && responseDTO.getMsg() != null) { +// RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); + Long routeId= cacheService.readRouteId(Long.valueOf(robotId)); + if (routeId != null && responseDTO.getMsg() != null) { PoseMessageResponseDTO dto = responseDTO.getMsg(); //执行循迹 保存当前轨迹信息 //更新实时定位信息 - robotStatusInfoService.updateRobotPoint(dto,robotId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId, dto); infoService.pointTestCallBack(dto, robotId); - if (statusInfo.getCurrRouteId() != null) { + if (routeId != null) { RobotTrajectoryInfo info = new RobotTrajectoryInfo(); info.setRobotId(Long.valueOf(robotId)); info.setCreateTime(new Date()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java new file mode 100644 index 0000000..a0f578e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.casic.missiles.modular.robot.service.ITaskInfoImgService; +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.casic.missiles.modular.robot.dao.TaskInfoImgMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; + + +/** + *

+ * 任务照片存储 服务实现类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +@Service +public class TaskInfoImgServiceImpl extends ServiceImpl implements ITaskInfoImgService { +@Override +public List selectTaskInfoImgPage(Page page,QueryWrapper query) { +return this.baseMapper.selectTaskInfoImgPage(page,query); +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java index 93745b6..d1417b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -6,11 +6,11 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.thread.ExecutorBuilder; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -47,6 +47,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; /** @@ -68,7 +69,10 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; private final IBaseRobotService baseRobotService; - + private final ITaskInfoImgService imgService; + /** + * 初始化线程池 + */ @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,7 +84,7 @@ @Value("${casic.obstacle:10}") private Integer obstacle; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -89,6 +93,7 @@ this.algorithmService = algorithmService; this.cacheService = cacheService; this.baseRobotService = baseRobotService; + this.imgService = imgService; } /** @@ -145,6 +150,13 @@ taskInfo.setDiscernTypeName(dictService.getDictNameByCode(RobotDictConstants.DISCERN_TYPE, taskInfo.getDiscernType() + "")); taskInfo.setTaskTypeName(dictService.getDictNameByCode(RobotDictConstants.TASK_TYPE, taskInfo.getTaskType() + "")); taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); + TaskInfoImg taskInfoImg = imgService.getById(taskInfo.getId()); + if (taskInfoImg != null) { + taskInfo.setRouteImg(taskInfoImg.getRouteImg()); + taskInfo.setPsdImg(taskInfoImg.getPsdImg()); + taskInfo.setMcaImg(taskInfoImg.getMcaImg()); + taskInfo.setHeatImg(taskInfoImg.getHeatImg()); + } //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); @@ -209,6 +221,7 @@ //清空任务缓存 robotCacheClean(robotId); + //清空机器当前任务 statusInfoService.updateCurrTask(robotId, null, null); @@ -240,6 +253,9 @@ //缓存当前点位信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; @@ -254,13 +270,25 @@ //算法初始化状态读取 Integer initValue = cacheService.readTaskInit(longId); - //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { + + try { + File file = new File("."); + File[] files = file.listFiles((dir, name) -> (name.endsWith(".png") && name.startsWith("step")) + || (name.endsWith(".txt") && name.startsWith("step")) || name.equals("repetition.txt") || name.equals("xy_train.txt") || name.equals("z_train.txt")); + if (files != null) { + for (int i = 0; i < files.length; i++) { + FileUtil.del(files[i]); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId); //中子源计数率读取 pathInitDTO.setCount(cacheService.getNeutronCount(longId)); @@ -288,7 +316,7 @@ AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); - sendWebSocket(InstructStatusMsgEnums.HEAT_MAP,robotId, response.getTaskHeatMap()); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap()); //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { @@ -329,6 +357,7 @@ RobotInfo robotInfo = cacheService.getRobotInfo(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); } @@ -426,22 +455,23 @@ * * @param imgDTO */ + @Transactional @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + TaskInfoImg infoImg = new TaskInfoImg(); if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + infoImg.setMcaImg(imgDTO.getMcaImg()); + infoImg.setHeatImg(path); } if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + infoImg.setPsdImg(imgDTO.getPsdImg()); } if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + infoImg.setRouteImg(imgDTO.getRouteImg()); } - updateWrapper.set(TaskInfo::getHeatImg, path); - updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); - update(updateWrapper); + infoImg.setId(Convert.toLong(imgDTO.getTaskId())); + imgService.saveOrUpdate(infoImg); } @SneakyThrows @@ -449,6 +479,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + wrapTaskInfo(info); RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java index 75fec0e..35f1d41 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java @@ -62,7 +62,6 @@ query.eq("(a.monitor_val genQuery() { +QueryWrapper query = new QueryWrapper<>(); +if (StrUtil.isNotEmpty(mcaImg)) { + query.eq("mca_img",mcaImg); +} +if (StrUtil.isNotEmpty(psdImg)) { + query.eq("psd_img",psdImg); +} +if (StrUtil.isNotEmpty(routeImg)) { + query.eq("route_img",routeImg); +} +if (StrUtil.isNotEmpty(heatImg)) { + query.eq("heat_img",heatImg); +} +return query; +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java deleted file mode 100644 index 99c4a6f..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.modular.system.controller; - - -import com.casic.missiles.model.response.ResponseData; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -/** - * @ClassName DemoController - * @Description TODO - * @Author lenovo - * @Date 2020/6/13 15:38 - * @Version 1.0 - */ -@RestController -@RequestMapping("/demo") -public class DemoController { - - - /** - * 获取mockToken - */ - @PostMapping("/test") - @ResponseBody - public Object testMqtt(String topic, String msg) { - - return ResponseData.success(); - } -} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java deleted file mode 100644 index c6ed867..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.modular.system.event; - -import com.casic.missiles.model.application.event.core.ModelEvent; -import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; -import com.casic.missiles.modular.system.model.User; - -/** - * 用户事件 - * - * @author lwh - */ -public class UserEvent extends ModelEvent { - /** - * Create a new {@code ApplicationEvent}. - * - * @param type 事件类型 - * @param source the object on which the event initially occurred or with - * which the event is associated (never {@code null}) - */ - public UserEvent(AbstractEventTypeEnum type, User source) { - super(type, source); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java deleted file mode 100644 index 4480ef2..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.modular.system.event.listener; - -import com.casic.missiles.core.application.event.UserLoginEvent; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -/** - * 用户事件订阅 - * - * @author lwh - */ -@Slf4j -@Component -public class UserOneListener { - @EventListener - public void onApplicationEvent(UserLoginEvent event) { - log.debug("用户1订阅:{}", event); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java deleted file mode 100644 index 8447a22..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.modular.system.event.listener; - -import com.casic.missiles.model.application.event.core.EventSubscriber; -import com.casic.missiles.modular.system.event.UserEvent; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * 用户事件订阅 - * - * @author lwh - */ -@Slf4j -@Component -public class UserTwoListener extends EventSubscriber { - @Override - public void onApplicationEvent(UserEvent event) { - log.debug("用户2订阅:{}", event); - } -} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 627e36f..01be493 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -57,6 +57,7 @@
+ org.springframework.boot spring-boot-starter-jdbc @@ -68,6 +69,11 @@ ${core.version} + io.swagger + swagger-models + 1.6.0 + + com.casic casic-admin-core ${admin.version} @@ -76,6 +82,10 @@ io.springfox springfox-swagger-ui + + io.swagger + swagger-models + diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 3d8ae29..fa44b21 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -6,7 +6,7 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://192.168.1.41:3000/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root - password: root + password: 123456 jms: pub-sub-domain: true # session: diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index b8e78ef..7fca313 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -27,7 +27,9 @@ serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer #mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector +# configuration: +# # 配置结果集属性为空时 是否映射返回结果 +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 ################### mybatis-plus配置 ################### ################### guns配置 ################### casic: diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 33ac8b4..c7b5d28 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java @@ -31,7 +31,7 @@ /** * PSD数据ID */ - String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + String KEY_PSD_DATA_ID = "PSD_DATA_ID_"; /** * 当前栅格点位信息 */ @@ -55,4 +55,26 @@ * 探测器配置参数缓存 */ String KEY_CONFIG_PARAMS_ID = "KEY_CONFIG_PARAMS_ID_"; + + /** + * 暂停状态缓存信息 + */ + String APP_NAV_PAUSE = "APP_NAV_PAUSE_ID_"; + /** + * 停障状态 + */ + String APP_STOP_NAVTRACK = "APP_STOP_NAVTRACK_ID_"; + /** + * 实时位置 + */ + String ROBOT_POINT = "ROBOT_POINT_ID_"; + /** + * 急停状态 + */ + String STOP_STATE = "STOP_STATE_ID_"; + + /** + * 电压状态 + */ + String VOLTAGE_RESPONSE = "voltage_response_id_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java index 1395aa4..92c8c8e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/IBaseRobotService.java @@ -8,6 +8,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.AppCmdVelResponse; import com.casic.missiles.modular.robot.opt.instruct.dto.BaseRobotCmdDTO; +import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; /** * 机器人操作类 @@ -73,4 +74,6 @@ * @param info */ void reloadPcd(RobotInfo info); + + void startTrack(StartTrackRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java index 30ed038..e2ed939 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotOptController.java @@ -136,7 +136,10 @@ @ApiOperation(value = "启动或关闭循迹功能", notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { - return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); + + + baseRobotService.startTrack(request); + return ResponseDataDTO.success(); } /** diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java index 838c6f9..e82a792 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/TaskInfoController.java @@ -1,34 +1,35 @@ package com.casic.missiles.modular.robot.controller; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.base.controller.BaseController; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.constants.RobotDictConstants; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.ImgDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; +import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; +import com.casic.missiles.modular.robot.opt.instruct.base.WsMsgBaseDTO; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; +import com.casic.missiles.modular.robot.vo.IdsDTO; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; -import org.springframework.util.Base64Utils; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import java.io.File; import java.math.BigDecimal; import java.util.List; @@ -38,6 +39,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Api(tags = "任务管理(其他信息待定)") @RestController @RequestMapping("/robot/taskInfo") @@ -62,15 +64,43 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** + * websocket 连接 + */ + @Resource + private WebSocket webSocket; /** + * websocket 消息推送 + * + * @param enums 推送消息枚举 + * @param robotId 机器人连接 + * @param heatMap 消息集合 + */ + protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, TaskHeatMap heatMap) { + try { + WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); + wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); + wsMsgBaseDTO.setData(heatMap); + String msg = JSON.toJSONString(wsMsgBaseDTO); +// log.info("推送{}消息:{}", enums.getRemarks(), msg); + webSocket.sendOneMessage(robotId, msg); + } catch (Exception e) { + log.error(e.getMessage()); + } + + } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "测试", hidden = true) - @GetMapping(value = "/test") - public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { - Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); - return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); + @GetMapping(value = "/testRl") + public ResponseDataDTO test() { + AlgorithmResponse response = new AlgorithmResponse(); + response.setTaskHeatMap(new TaskHeatMap()); + algorithmService.readAlgorithmResponse("step3.txt",response,123L,null); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, "1", response.getTaskHeatMap()); + return ResponseDataDTO.success(response); } /** @@ -98,7 +128,6 @@ @ApiOperation("图片路径保存") @GetMapping(value = "/saveImg") public ResponseDataDTO> saveImg(ImgDTO imgDTO) { - taskInfoService.saveImg(imgDTO); return ResponseDataDTO.success(); } @@ -146,9 +175,9 @@ * 删除任务管理 */ @ApiOperation(value = "删除接口") - @GetMapping(value = "/delete") - public ResponseDataDTO delete(@RequestBody List ids) { - taskInfoService.removeByIds(ids); + @PostMapping(value = "/delete") + public ResponseDataDTO delete(@RequestBody IdsDTO ids) { + taskInfoService.removeByIds(ids.getIds()); return ResponseDataDTO.success(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java new file mode 100644 index 0000000..9d012da --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/TaskInfoImgMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 任务照片存储 Mapper 接口 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface TaskInfoImgMapper extends BaseMapper { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml new file mode 100644 index 0000000..e330c68 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/TaskInfoImgMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + id , + mca_img as mcaImg , + psd_img as psdImg , + route_img as routeImg , + heat_img as heatImg + + + a.id , + a.mca_img + as mcaImg , + a.psd_img + as psdImg , + a.route_img + as routeImg , + a.heat_img + as heatImg + + + + + + and mca_img = #{request.mcaImg} + + + and psd_img = #{request.psdImg} + + + and route_img = #{request.routeImg} + + + and heat_img = #{request.heatImg} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java new file mode 100644 index 0000000..ed06f3b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageEvent.java @@ -0,0 +1,32 @@ +package com.casic.missiles.modular.robot.event; + +import com.casic.missiles.model.application.event.core.ModelEvent; +import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +/** + * 用户登录数据变化事件 + * + * @author lwh + */ +public class PoseMessageEvent extends ModelEvent { + private String robotId; + /** + * Create a new {@code ApplicationEvent}. + * + * @param type 事件类型 + * @param source the object on which the event initially occurred or with + * which the event is associated (never {@code null}) + */ + public PoseMessageEvent(AbstractEventTypeEnum type, MqttMessage source) { + super(type, source); + } + + public String getRobotId() { + return robotId; + } + + public void setRobotId(String robotId) { + this.robotId = robotId; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java new file mode 100644 index 0000000..2cc6cdc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/event/PoseMessageListener.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.robot.event; + +import cn.hutool.core.thread.ExecutorBuilder; +import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; +import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定位事件监听器 + * @see com.casic.missiles.modular.robot.opt.handler.msg.PoseMessageMsgHandler + */ +@Slf4j +@Component +public class PoseMessageListener { + private static ThreadPoolExecutor threadPoolExecutor = ExecutorBuilder.create().setCorePoolSize(5).setMaxPoolSize(10).build(); + private final IRobotStatusInfoService statusInfoService; + private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + + public PoseMessageListener(IRobotStatusInfoService statusInfoService, IRobotTrajectoryInfoService robotTrajectoryInfoService) { + this.statusInfoService = statusInfoService; + this.robotTrajectoryInfoService = robotTrajectoryInfoService; + } + + @EventListener + public void onApplicationEvent(PoseMessageEvent event) { +// threadPoolExecutor.execute(() -> { }); + robotTrajectoryInfoService.savePoseMessage(event.getRobotId(), (MqttMessage) event.getSource()); + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java new file mode 100644 index 0000000..7e881d9 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfoImg.java @@ -0,0 +1,52 @@ +package com.casic.missiles.modular.robot.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 任务照片存储对象 task_info_img + * + * @author lwh + * @date 2024-01-30 + */ +@Data +@TableName("task_info_img") +public class TaskInfoImg extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务ID", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "MCA图片", dataType = "String") + @TableField("mca_img") + private String mcaImg; + + @ApiModelProperty(value = "PSD图片", dataType = "String") + @TableField("psd_img") + private String psdImg; + + @ApiModelProperty(value = "巡检路线img", dataType = "String") + @TableField("route_img") + private String routeImg; + + @ApiModelProperty(value = "热点分布图", dataType = "String") + @TableField("heat_img") + private String heatImg; + + + @Override + public String toString() { + return "TaskInfoImg{" + + "id=" + id + + "mcaImg=" + mcaImg + + "psdImg=" + psdImg + + "routeImg=" + routeImg + + "heatImg=" + heatImg + + "}"; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java index d74a38b..c4bc25d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructCodeEnums.java @@ -35,7 +35,7 @@ }), TRACK_RECORD("/track_record" , "/track_record_response" , "启动或关闭轨迹录制功能" , true, new TypeReference>() { }), - START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , true, new TypeReference>() { + START_TRACK("/start_track" , "/start_track_response" , "启动或关闭循迹功能" , false, new TypeReference>() { }), DELETE_TRACK("/delete_track" , "/delete_track_response" , "删除路线" , false, new TypeReference>() { }), diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java index 41879dd..83f4cb2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/AbstractSocketHandler.java @@ -13,6 +13,7 @@ /** * websocket 推送消息 + * @see com.casic.missiles.mqtt.config.MqttClientConfigListener#createMqtt */ @Slf4j public abstract class AbstractSocketHandler implements IBaseMsgHandler { @@ -48,7 +49,7 @@ wsMsgBaseDTO.setMsgKey(enums.getMsgKey()); wsMsgBaseDTO.setData(jsonObject.get("msg")); String msg = JSON.toJSONString(wsMsgBaseDTO); -// log.info("推送{}消息:{}", enums.getRemarks(), msg); + log.info("推送{}消息:{}", enums.getRemarks(), msg); webSocket.sendOneMessage(robotId, msg); } } catch (Exception e) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java index b8e561d..5e3fe49 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/IBaseMsgHandler.java @@ -6,6 +6,8 @@ * 业务消息处理器 */ public interface IBaseMsgHandler { + static String index_key = "index"; + /** * 消息处理handler * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index cefe2cd..27bed0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -55,9 +55,6 @@ } messageDTO.setMsg(request); ResponseDataDTO list = null; - if (request.getAction() != 1) { - taskInfoService.reloadTask(request, getRobotInfo()); - } try { list = optService.robotCmd(getRobotInfo(), InstructCodeEnums.START_TRACK, messageDTO); } catch (Exception e) { @@ -75,8 +72,7 @@ */ @Override public ResponseDataDTO afterInvoke(StartTrackRequest request, ResponseDataDTO response) { - //增加循迹任务记录 - taskInfoService.reloadTask(request, getRobotInfo()); + return response; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java index 316fd8f..8b7fd0e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppNavPauseMsgHandler.java @@ -19,7 +19,7 @@ private static Map index = new ConcurrentHashMap<>(); static { - index.put("index", 0); + index.put(index_key, 0); } public AppNavPauseMsgHandler(IRobotStatusInfoService statusInfoService) { @@ -28,7 +28,12 @@ @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppNavPause(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},暂停状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppNavPause(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java index 83d1d39..67ec20e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/AppStopNavtrackMsgHandler.java @@ -6,6 +6,9 @@ import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 停障状态实时接收器 */ @@ -13,14 +16,23 @@ @Component("/app_stop_navtrack") public class AppStopNavtrackMsgHandler implements IBaseMsgHandler { private final IRobotStatusInfoService statusInfoService; - + private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public AppStopNavtrackMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); - statusInfoService.saveAppStopNavtrack(robotId,message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + statusInfoService.saveAppStopNavtrack(robotId,message); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..9c26129 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -1,28 +1,37 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.application.enums.LoginEventTypeEnum; +import com.casic.missiles.model.application.event.core.EventPublisher; +import com.casic.missiles.modular.robot.event.PoseMessageEvent; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; -import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; /** * 实时位置接收器 + * */ @Slf4j @Component("/pose_message") public class PoseMessageMsgHandler extends AbstractSocketHandler { - private final IRobotTrajectoryInfoService robotTrajectoryInfoService; - public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { - this.robotTrajectoryInfoService = robotTrajectoryInfoService; + private final EventPublisher publisher; + + public PoseMessageMsgHandler(EventPublisher publisher) { + + this.publisher = publisher; } @Override public void process(String robotId, String topic, MqttMessage message) { - robotTrajectoryInfoService.savePoseMessage(robotId, message); +// log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); sendWebSocket(InstructStatusMsgEnums.POSE_MESSAGE, robotId, message); + PoseMessageEvent event = new PoseMessageEvent(LoginEventTypeEnum.RELOAD_SCOPE, message); + event.setRobotId(robotId); + publisher.publishEvent(event); + log.info("实时定位已发送!!"); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java index 4910f62..b248839 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/ProcessMessageMsgHandler.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.model.application.event.core.EventPublisher; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -16,17 +17,18 @@ @Slf4j @Component("/process_message") public class ProcessMessageMsgHandler extends AbstractSocketHandler { - private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); - - public ProcessMessageMsgHandler(IRobotStatusInfoService statusInfoService) { + private final EventPublisher publisher; + private final IRobotStatusInfoService statusInfoService; + public ProcessMessageMsgHandler(EventPublisher publisher, IRobotStatusInfoService statusInfoService) { + this.publisher = publisher; this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { log.info("建图进度:{}", message); - statusInfoService.saveProcessMessage(robotId, message); + statusInfoService.saveProcessMessage(robotId,message); sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java index 3a19ebe..9d275bd 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/SensorStatusMsgHandler.java @@ -34,7 +34,7 @@ index.put("index" , val); if (val > 30) { index.put("index" , 0); - statusInfoService.saveSensorStatus(robotId, message); +// statusInfoService.saveSensorStatus(robotId, message); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java index 3acf1d7..8950815 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/StopStateMsgHandler.java @@ -19,13 +19,22 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } public StopStateMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { - statusInfoService.saveStopState(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + + index.put(index_key, index.get("index") + 1); + if (index.get(index_key)>50) { + index.put(index_key, 0); + log.info("主键:{},停障状态topic:{},消息内容:{}", robotId, topic, message.toString()); + + statusInfoService.saveStopState(robotId, message); + } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java index ad0eda8..a9d7914 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/VoltageResponseMsgHandler.java @@ -1,8 +1,13 @@ package com.casic.missiles.modular.robot.opt.handler.msg; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.VoltageDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; @@ -20,20 +25,58 @@ private final IRobotStatusInfoService statusInfoService; private static Map index = new ConcurrentHashMap<>(); + static { + index.put(index_key, 0); + } + public VoltageResponseMsgHandler(IRobotStatusInfoService statusInfoService) { this.statusInfoService = statusInfoService; } @Override public void process(String robotId, String topic, MqttMessage message) { -// log.info("----------------------电压信息反馈:{}", message); - statusInfoService.saveVoltageResponseMessage(robotId, message); - sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); - try{ - RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); - sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); - }catch (Exception e){ + index.put(index_key, index.get("index") + 1); + if (index.get(index_key) > 50) { + index.put(index_key, 0); + log.info("----------------------电压信息反馈:{}", message); + statusInfoService.saveVoltageResponseMessage(robotId, message); + } + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + try { + + RobotStatusInfo robotStatusInfo = statusInfoService.getStatusByRobotId(robotId); + Integer appNav = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId); + Integer appStop = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId); + PoseMessageResponseDTO dto = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId); + StopStateResponseDTO stopStateResponseDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId); + VoltageDTO voltageDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId); + if (robotStatusInfo != null) { + if (appNav != null) { + robotStatusInfo.setAppNavPause(appNav); + } + if (appStop != null) { + robotStatusInfo.setAppStopNavtrack(appStop); + } + if (dto != null) { + robotStatusInfo.setPostionX(dto.getX()); + robotStatusInfo.setPostionY(dto.getY()); + robotStatusInfo.setPostionZ(dto.getZ()); + } + if (stopStateResponseDTO != null) { + robotStatusInfo.setSoft(stopStateResponseDTO.getSoft()); + robotStatusInfo.setSonic(stopStateResponseDTO.getSonic()); + robotStatusInfo.setCollision(stopStateResponseDTO.getCollision()); + robotStatusInfo.setButton(stopStateResponseDTO.getButton()); + } + if (voltageDTO != null) { + robotStatusInfo.setVoltage(voltageDTO.getVoltage()); + robotStatusInfo.setElectricityQuantity(voltageDTO.getElectricityQuantity()); + } + } + //读取缓存信息 + sendWebSocket(InstructStatusMsgEnums.ROBOT_STATUS, robotId, robotStatusInfo); + } catch (Exception e) { e.printStackTrace(); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java index c2c2773..8471e7a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/impl/RobotOptServiceImpl.java @@ -141,6 +141,13 @@ //机器人pcd读取 robotInfoService.loadPcd(info); } + @Transactional + @Override + public void startTrack(StartTrackRequest request) { + //增加循迹任务记录 + taskInfoService.reloadTask(request, robotInfoService.getById(request.getRobotId())); + this.execCmdHandler(request, InstructCodeEnums.START_TRACK); + } public IRobotRouteOptService getRobotRouteOptService() { return robotRouteOptService; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java new file mode 100644 index 0000000..c5071bc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/response/VoltageDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.robot.opt.instruct.response; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class VoltageDTO implements Serializable { + private Integer electricityQuantity; + private BigDecimal voltage; +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index 9065f34..56b3e1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -7,6 +7,7 @@ import com.casic.missiles.modular.robot.model.RobotInfo; import java.math.BigDecimal; +import java.util.List; /** * 循迹算法调用 @@ -37,4 +38,5 @@ * @return */ GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, BigDecimal resolution, RobotInfo robotInfo); + void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java new file mode 100644 index 0000000..f197c10 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoImgService.java @@ -0,0 +1,22 @@ +package com.casic.missiles.modular.robot.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.model.TaskInfoImg; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; + + +/** + *

+ * 任务照片存储 服务类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +public interface ITaskInfoImgService extends IService { +/** +* 任务照片存储 分页检索 +*/ +List selectTaskInfoImgPage(Page page,QueryWrapper query);} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java index df4a330..f808fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlgorithmServiceImpl.java @@ -64,7 +64,7 @@ @Override public AlgorithmResponse pathPlanning(PathPlanDTO planDTO) { if (StrUtil.isEmpty(planDTO.getCount())) { - planDTO.setCount("0.01"); + planDTO.setCount("0.001"); } //算法路径及入参配置 List commends = new ArrayList<>(); @@ -162,8 +162,8 @@ x = x.subtract(robotInfo.getOriginX()); y = y.subtract(robotInfo.getOriginY()); - pointDTO.setX(new BigDecimal(x.multiply(scale).intValue())); - pointDTO.setY(new BigDecimal(y.multiply(scale).intValue())); + pointDTO.setX(new BigDecimal(x.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); + pointDTO.setY(new BigDecimal(y.divide(scale,3,BigDecimal.ROUND_HALF_UP).intValue()+1)); return pointDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java index 0257c90..6d3ae91 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotStatusInfoServiceImpl.java @@ -1,18 +1,18 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotStatusInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotMsgDTO; @@ -21,10 +21,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.ProcessMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.SensorStatusDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.AppCostmapResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.SpeedResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.StopStateResponseDTO; -import com.casic.missiles.modular.robot.opt.instruct.response.VoltageResponseDTO; +import com.casic.missiles.modular.robot.opt.instruct.response.*; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; @@ -151,7 +148,8 @@ public void saveProcessMessage(String robotId, MqttMessage message) { // String json = new String(message.getPayload()); - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO.getMsg() != null) { UpdateWrapper query = new UpdateWrapper<>(); ProcessMessageResponseDTO msg = responseDTO.getMsg(); @@ -173,11 +171,8 @@ RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_nav_pause", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_NAV_PAUSE + robotId, msg.getResult()); } } @@ -186,12 +181,10 @@ String json = new String(message.getPayload()); RobotMsgResponseDTO responseDTO = JSON.parseObject(json, new TypeReference>() { }); + if (responseDTO.getMsg() != null) { - UpdateWrapper query = new UpdateWrapper<>(); RobotMsgDTO msg = responseDTO.getMsg(); - query.set("app_stop_navtrack", msg.getResult()); - query.eq("robot_id", robotId); - update(query); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.APP_STOP_NAVTRACK + robotId, msg.getResult()); } } @@ -228,16 +221,11 @@ @Override public void saveStopState(String robotId, MqttMessage message) { - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>(){}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { -// log.info("急停状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); - query.set(RobotStatusInfo::getButton, responseDTO.getMsg().getButton()); - query.set(RobotStatusInfo::getCollision, responseDTO.getMsg().getCollision()); - query.set(RobotStatusInfo::getSonic, responseDTO.getMsg().getSonic()); - query.set(RobotStatusInfo::getSoft, responseDTO.getMsg().getSoft()); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + log.info("急停状态保存:{}", responseDTO.getMsg()); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.STOP_STATE + robotId, responseDTO.getMsg()); } } @@ -250,37 +238,39 @@ if (responseDTO != null && responseDTO.getMsg() != null) { RobotInfo info = robotInfoService.getById(robotId); log.info("电压状态保存:{}", responseDTO.getMsg()); - LambdaUpdateWrapper query = new LambdaUpdateWrapper<>(); if (CollectionUtil.isNotEmpty(responseDTO.getMsg().getVoltage())) { Integer v = responseDTO.getMsg().getVoltage().get(0); - query.set(RobotStatusInfo::getVoltage, v); //计算电量 Double quantity = new BigDecimal(v - info.getVoltageMin()).divide(new BigDecimal(info.getVoltageMax() - info.getVoltageMin()), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); - query.set(RobotStatusInfo::getElectricityQuantity, quantity * 100); - query.eq(RobotStatusInfo::getRobotId, robotId); - update(query); + VoltageDTO voltageDTO = new VoltageDTO(); + voltageDTO.setVoltage(new BigDecimal(v)); + voltageDTO.setElectricityQuantity(Convert.toInt(quantity * 100)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.VOLTAGE_RESPONSE + robotId, voltageDTO); } } } /** * 机器人栅格数据 + * * @param robotId 机器人障碍物栅格数据保存 * @param message 消息体 */ @Override public void saveCostMap(String robotId, MqttMessage message) { //数据接收 - RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() {}); + RobotResponseDTO responseDTO = parseJson(message, new TypeReference>() { + }); if (responseDTO != null && responseDTO.getMsg() != null) { cacheService.updateCostMap(robotId, responseDTO.getMsg()); - robotInfoService.updateRobotGrid(robotId,responseDTO.getMsg()); + robotInfoService.updateRobotGrid(robotId, responseDTO.getMsg()); // log.info("--------------- json data:{}", JSON.toJSONString(responseDTO.getMsg())); } } @Override public void updateRobotPoint(PoseMessageResponseDTO dto, String robotId) { + //todo cache UpdateWrapper query = new UpdateWrapper<>(); query.set("postion_x", dto.getX()); query.set("postion_y", dto.getY()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index bb066f4..6c9625f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.RobotTrajectoryInfoMapper; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; @@ -34,11 +36,12 @@ public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + private final IRobotCacheService cacheService; - - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService, IRobotCacheService cacheService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; + this.cacheService = cacheService; } @Override @@ -54,14 +57,15 @@ }); //读取导航状态,如果导航未开启则不存储 - RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); - if (statusInfo != null && responseDTO.getMsg() != null) { +// RobotStatusInfo statusInfo = robotStatusInfoService.getStatusByRobotId(robotId); + Long routeId= cacheService.readRouteId(Long.valueOf(robotId)); + if (routeId != null && responseDTO.getMsg() != null) { PoseMessageResponseDTO dto = responseDTO.getMsg(); //执行循迹 保存当前轨迹信息 //更新实时定位信息 - robotStatusInfoService.updateRobotPoint(dto,robotId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.ROBOT_POINT + robotId, dto); infoService.pointTestCallBack(dto, robotId); - if (statusInfo.getCurrRouteId() != null) { + if (routeId != null) { RobotTrajectoryInfo info = new RobotTrajectoryInfo(); info.setRobotId(Long.valueOf(robotId)); info.setCreateTime(new Date()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java new file mode 100644 index 0000000..a0f578e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoImgServiceImpl.java @@ -0,0 +1,28 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.casic.missiles.modular.robot.service.ITaskInfoImgService; +import java.util.List; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.casic.missiles.modular.robot.dao.TaskInfoImgMapper; +import com.casic.missiles.modular.robot.model.TaskInfoImg; + + +/** + *

+ * 任务照片存储 服务实现类 + *

+ * + * @author lwh + * @date 2024-01-30 + */ +@Service +public class TaskInfoImgServiceImpl extends ServiceImpl implements ITaskInfoImgService { +@Override +public List selectTaskInfoImgPage(Page page,QueryWrapper query) { +return this.baseMapper.selectTaskInfoImgPage(page,query); +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java index 93745b6..d1417b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -6,11 +6,11 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.thread.ExecutorBuilder; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -47,6 +47,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; /** @@ -68,7 +69,10 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; private final IBaseRobotService baseRobotService; - + private final ITaskInfoImgService imgService; + /** + * 初始化线程池 + */ @Value("${casic.file.uploadPath}") private String uploadPath; @@ -80,7 +84,7 @@ @Value("${casic.obstacle:10}") private Integer obstacle; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService, ITaskInfoImgService imgService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -89,6 +93,7 @@ this.algorithmService = algorithmService; this.cacheService = cacheService; this.baseRobotService = baseRobotService; + this.imgService = imgService; } /** @@ -145,6 +150,13 @@ taskInfo.setDiscernTypeName(dictService.getDictNameByCode(RobotDictConstants.DISCERN_TYPE, taskInfo.getDiscernType() + "")); taskInfo.setTaskTypeName(dictService.getDictNameByCode(RobotDictConstants.TASK_TYPE, taskInfo.getTaskType() + "")); taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); + TaskInfoImg taskInfoImg = imgService.getById(taskInfo.getId()); + if (taskInfoImg != null) { + taskInfo.setRouteImg(taskInfoImg.getRouteImg()); + taskInfo.setPsdImg(taskInfoImg.getPsdImg()); + taskInfo.setMcaImg(taskInfoImg.getMcaImg()); + taskInfo.setHeatImg(taskInfoImg.getHeatImg()); + } //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); @@ -209,6 +221,7 @@ //清空任务缓存 robotCacheClean(robotId); + //清空机器当前任务 statusInfoService.updateCurrTask(robotId, null, null); @@ -240,6 +253,9 @@ //缓存当前点位信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId, dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; @@ -254,13 +270,25 @@ //算法初始化状态读取 Integer initValue = cacheService.readTaskInit(longId); - //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { + + try { + File file = new File("."); + File[] files = file.listFiles((dir, name) -> (name.endsWith(".png") && name.startsWith("step")) + || (name.endsWith(".txt") && name.startsWith("step")) || name.equals("repetition.txt") || name.equals("xy_train.txt") || name.equals("z_train.txt")); + if (files != null) { + for (int i = 0; i < files.length; i++) { + FileUtil.del(files[i]); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + PathInitDTO pathInitDTO = createInitDTO(robotInfo, pointDTO, taskId, robotId); //中子源计数率读取 pathInitDTO.setCount(cacheService.getNeutronCount(longId)); @@ -288,7 +316,7 @@ AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); //存储算法输出栅格信息 CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); - sendWebSocket(InstructStatusMsgEnums.HEAT_MAP,robotId, response.getTaskHeatMap()); + sendWebSocket(InstructStatusMsgEnums.HEAT_MAP, robotId, response.getTaskHeatMap()); //是否触发寻源操作 BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { @@ -329,6 +357,7 @@ RobotInfo robotInfo = cacheService.getRobotInfo(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getResolution(), robotInfo); + log.info("currGrid:{}", pointDTO); } @@ -426,22 +455,23 @@ * * @param imgDTO */ + @Transactional @Override public void saveImg(ImgDTO imgDTO) { String path = saveHeatImg(imgDTO.getTaskId()); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + TaskInfoImg infoImg = new TaskInfoImg(); if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { - updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + infoImg.setMcaImg(imgDTO.getMcaImg()); + infoImg.setHeatImg(path); } if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { - updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + infoImg.setPsdImg(imgDTO.getPsdImg()); } if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { - updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + infoImg.setRouteImg(imgDTO.getRouteImg()); } - updateWrapper.set(TaskInfo::getHeatImg, path); - updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); - update(updateWrapper); + infoImg.setId(Convert.toLong(imgDTO.getTaskId())); + imgService.saveOrUpdate(infoImg); } @SneakyThrows @@ -449,6 +479,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + wrapTaskInfo(info); RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java index 75fec0e..35f1d41 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/AlarmRecordVO.java @@ -62,7 +62,6 @@ query.eq("(a.monitor_val genQuery() { +QueryWrapper query = new QueryWrapper<>(); +if (StrUtil.isNotEmpty(mcaImg)) { + query.eq("mca_img",mcaImg); +} +if (StrUtil.isNotEmpty(psdImg)) { + query.eq("psd_img",psdImg); +} +if (StrUtil.isNotEmpty(routeImg)) { + query.eq("route_img",routeImg); +} +if (StrUtil.isNotEmpty(heatImg)) { + query.eq("heat_img",heatImg); +} +return query; +}} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java deleted file mode 100644 index 99c4a6f..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/DemoController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.missiles.modular.system.controller; - - -import com.casic.missiles.model.response.ResponseData; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -/** - * @ClassName DemoController - * @Description TODO - * @Author lenovo - * @Date 2020/6/13 15:38 - * @Version 1.0 - */ -@RestController -@RequestMapping("/demo") -public class DemoController { - - - /** - * 获取mockToken - */ - @PostMapping("/test") - @ResponseBody - public Object testMqtt(String topic, String msg) { - - return ResponseData.success(); - } -} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java deleted file mode 100644 index c6ed867..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/UserEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.casic.missiles.modular.system.event; - -import com.casic.missiles.model.application.event.core.ModelEvent; -import com.casic.missiles.model.application.event.type.AbstractEventTypeEnum; -import com.casic.missiles.modular.system.model.User; - -/** - * 用户事件 - * - * @author lwh - */ -public class UserEvent extends ModelEvent { - /** - * Create a new {@code ApplicationEvent}. - * - * @param type 事件类型 - * @param source the object on which the event initially occurred or with - * which the event is associated (never {@code null}) - */ - public UserEvent(AbstractEventTypeEnum type, User source) { - super(type, source); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java deleted file mode 100644 index 4480ef2..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserOneListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.modular.system.event.listener; - -import com.casic.missiles.core.application.event.UserLoginEvent; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -/** - * 用户事件订阅 - * - * @author lwh - */ -@Slf4j -@Component -public class UserOneListener { - @EventListener - public void onApplicationEvent(UserLoginEvent event) { - log.debug("用户1订阅:{}", event); - } -} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java b/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java deleted file mode 100644 index 8447a22..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/event/listener/UserTwoListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.casic.missiles.modular.system.event.listener; - -import com.casic.missiles.model.application.event.core.EventSubscriber; -import com.casic.missiles.modular.system.event.UserEvent; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/** - * 用户事件订阅 - * - * @author lwh - */ -@Slf4j -@Component -public class UserTwoListener extends EventSubscriber { - @Override - public void onApplicationEvent(UserEvent event) { - log.debug("用户2订阅:{}", event); - } -} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 627e36f..01be493 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -57,6 +57,7 @@
+ org.springframework.boot spring-boot-starter-jdbc @@ -68,6 +69,11 @@ ${core.version} + io.swagger + swagger-models + 1.6.0 + + com.casic casic-admin-core ${admin.version} @@ -76,6 +82,10 @@ io.springfox springfox-swagger-ui + + io.swagger + swagger-models + diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 3d8ae29..fa44b21 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -6,7 +6,7 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://192.168.1.41:3000/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root - password: root + password: 123456 jms: pub-sub-domain: true # session: diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index b8e78ef..7fca313 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -27,7 +27,9 @@ serializer: org.springframework.data.redis.serializer.StringRedisSerializer redisValueSerializer: org.springframework.data.redis.serializer.JdkSerializationRedisSerializer #mybatis-plus: -# sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector +# configuration: +# # 配置结果集属性为空时 是否映射返回结果 +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 ################### mybatis-plus配置 ################### ################### guns配置 ################### casic: diff --git a/pom.xml b/pom.xml index 5e1a9ed..26979ba 100644 --- a/pom.xml +++ b/pom.xml @@ -45,11 +45,27 @@ casic-knife4j-boot-starter ${extension.version} + org.springframework.boot spring-boot-starter-web ${boot.version} + + com.casic + casic-admin-core + ${admin.version} + + + io.springfox + springfox-swagger-ui + + + io.swagger + swagger-models + + + com.casic