diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index 2f8eba5..e03b965 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -29,4 +29,11 @@ * @param robotInfo 机器信息 */ void updateSpeed(RobotInfoSetDTO robotInfo); + + /** + * 加载机器人信息至本地 + * + * @param info + */ + void loadPcd(RobotInfo info); } diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index 2f8eba5..e03b965 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -29,4 +29,11 @@ * @param robotInfo 机器信息 */ void updateSpeed(RobotInfoSetDTO robotInfo); + + /** + * 加载机器人信息至本地 + * + * @param info + */ + void loadPcd(RobotInfo info); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index c491462..c41e16a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -48,5 +50,14 @@ * * @param dto 实体 */ - void pointCallBack(PoseMessageResponseDTO dto,String robotId); + void pointCallBack(PoseMessageResponseDTO dto, String robotId); + + /** + * 图片路径保存 + * + * @param imgDTO + */ + void saveImg(ImgDTO imgDTO); + + void exportDoc(HttpServletResponse response, String taskId); } diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index 2f8eba5..e03b965 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -29,4 +29,11 @@ * @param robotInfo 机器信息 */ void updateSpeed(RobotInfoSetDTO robotInfo); + + /** + * 加载机器人信息至本地 + * + * @param info + */ + void loadPcd(RobotInfo info); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index c491462..c41e16a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -48,5 +50,14 @@ * * @param dto 实体 */ - void pointCallBack(PoseMessageResponseDTO dto,String robotId); + void pointCallBack(PoseMessageResponseDTO dto, String robotId); + + /** + * 图片路径保存 + * + * @param imgDTO + */ + void saveImg(ImgDTO imgDTO); + + void exportDoc(HttpServletResponse response, String taskId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java index 3a22f77..1fc46bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java @@ -70,6 +70,13 @@ } @Override + public List selectListByTaskId(Long id, Long robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("task_id", id); + return list(query); + } + + @Override public boolean getAlarmByTask(Long taskId) { QueryWrapper query = new QueryWrapper<>(); query.eq("task_id", taskId); diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index 2f8eba5..e03b965 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -29,4 +29,11 @@ * @param robotInfo 机器信息 */ void updateSpeed(RobotInfoSetDTO robotInfo); + + /** + * 加载机器人信息至本地 + * + * @param info + */ + void loadPcd(RobotInfo info); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index c491462..c41e16a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -48,5 +50,14 @@ * * @param dto 实体 */ - void pointCallBack(PoseMessageResponseDTO dto,String robotId); + void pointCallBack(PoseMessageResponseDTO dto, String robotId); + + /** + * 图片路径保存 + * + * @param imgDTO + */ + void saveImg(ImgDTO imgDTO); + + void exportDoc(HttpServletResponse response, String taskId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java index 3a22f77..1fc46bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java @@ -70,6 +70,13 @@ } @Override + public List selectListByTaskId(Long id, Long robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("task_id", id); + return list(query); + } + + @Override public boolean getAlarmByTask(Long taskId) { QueryWrapper query = new QueryWrapper<>(); query.eq("task_id", taskId); 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 dccb098..bb7c9d2 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 @@ -44,11 +44,11 @@ List commends = new ArrayList<>(); commends.add(initPath); commends.addAll(initDTO.toArray()); - List res= AlgorithmUtils.invokeJob(commends); + List res = AlgorithmUtils.invokeJob(commends); //判断当前任务是否开启 - AlgorithmResponse response = getAlgorithmResponse(initDTO,res); - if(response.getTaskHeatMap()!=null){ + AlgorithmResponse response = getAlgorithmResponse(initDTO, res); + if (response.getTaskHeatMap() != null) { heatMapService.saveOrUpdateByTaskId(response.getTaskHeatMap()); } return response; @@ -62,22 +62,26 @@ commends.add(planPath); commends.addAll(planDTO.toArray()); List res = AlgorithmUtils.invokeJob(commends); - AlgorithmResponse response = getAlgorithmResponse(planDTO,res); - // + AlgorithmResponse response = getAlgorithmResponse(planDTO, res); + //next 点位编写 + if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + } return response; } - private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO,List res) { + private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO, List res) { File repetitionFile = new File("repetition.txt"); AlgorithmResponse response = new AlgorithmResponse(); if (initDTO.getTaskId() != null && repetitionFile.exists()) { - readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(), res); } else { log.info("taskId is empty!"); } - readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(),res); - readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(), res); + readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(), res); return response; } @@ -88,7 +92,7 @@ * @param response 结果集 * @param taskId 任务ID */ - public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId,List res) { + public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res) { File file = new File(fileName); if (!file.exists()) { log.info("{} file is empty!", fileName); @@ -108,7 +112,7 @@ List xyTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(xyTrains)) { if (CollectionUtil.isNotEmpty(xyTrains)) { - List list = StrUtil.split(xyTrains.get(xyTrains.size()-1), " "); + List list = StrUtil.split(xyTrains.get(xyTrains.size() - 1), " "); response.getPointNextDTO().setX(formatBigDecimal(list.get(0))); response.getPointNextDTO().setY(formatBigDecimal(list.get(1))); } @@ -117,10 +121,10 @@ case "z_train.txt": List zTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(zTrains)) { - String zTrain = zTrains.get(zTrains.size()-1); - response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); + String zTrain = zTrains.get(zTrains.size() - 1); + response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); } - break; + break; } } diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index 2f8eba5..e03b965 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -29,4 +29,11 @@ * @param robotInfo 机器信息 */ void updateSpeed(RobotInfoSetDTO robotInfo); + + /** + * 加载机器人信息至本地 + * + * @param info + */ + void loadPcd(RobotInfo info); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index c491462..c41e16a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -48,5 +50,14 @@ * * @param dto 实体 */ - void pointCallBack(PoseMessageResponseDTO dto,String robotId); + void pointCallBack(PoseMessageResponseDTO dto, String robotId); + + /** + * 图片路径保存 + * + * @param imgDTO + */ + void saveImg(ImgDTO imgDTO); + + void exportDoc(HttpServletResponse response, String taskId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java index 3a22f77..1fc46bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java @@ -70,6 +70,13 @@ } @Override + public List selectListByTaskId(Long id, Long robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("task_id", id); + return list(query); + } + + @Override public boolean getAlarmByTask(Long taskId) { QueryWrapper query = new QueryWrapper<>(); query.eq("task_id", taskId); 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 dccb098..bb7c9d2 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 @@ -44,11 +44,11 @@ List commends = new ArrayList<>(); commends.add(initPath); commends.addAll(initDTO.toArray()); - List res= AlgorithmUtils.invokeJob(commends); + List res = AlgorithmUtils.invokeJob(commends); //判断当前任务是否开启 - AlgorithmResponse response = getAlgorithmResponse(initDTO,res); - if(response.getTaskHeatMap()!=null){ + AlgorithmResponse response = getAlgorithmResponse(initDTO, res); + if (response.getTaskHeatMap() != null) { heatMapService.saveOrUpdateByTaskId(response.getTaskHeatMap()); } return response; @@ -62,22 +62,26 @@ commends.add(planPath); commends.addAll(planDTO.toArray()); List res = AlgorithmUtils.invokeJob(commends); - AlgorithmResponse response = getAlgorithmResponse(planDTO,res); - // + AlgorithmResponse response = getAlgorithmResponse(planDTO, res); + //next 点位编写 + if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + } return response; } - private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO,List res) { + private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO, List res) { File repetitionFile = new File("repetition.txt"); AlgorithmResponse response = new AlgorithmResponse(); if (initDTO.getTaskId() != null && repetitionFile.exists()) { - readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(), res); } else { log.info("taskId is empty!"); } - readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(),res); - readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(), res); + readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(), res); return response; } @@ -88,7 +92,7 @@ * @param response 结果集 * @param taskId 任务ID */ - public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId,List res) { + public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res) { File file = new File(fileName); if (!file.exists()) { log.info("{} file is empty!", fileName); @@ -108,7 +112,7 @@ List xyTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(xyTrains)) { if (CollectionUtil.isNotEmpty(xyTrains)) { - List list = StrUtil.split(xyTrains.get(xyTrains.size()-1), " "); + List list = StrUtil.split(xyTrains.get(xyTrains.size() - 1), " "); response.getPointNextDTO().setX(formatBigDecimal(list.get(0))); response.getPointNextDTO().setY(formatBigDecimal(list.get(1))); } @@ -117,10 +121,10 @@ case "z_train.txt": List zTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(zTrains)) { - String zTrain = zTrains.get(zTrains.size()-1); - response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); + String zTrain = zTrains.get(zTrains.size() - 1); + response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); } - break; + break; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java index ae9e520..fe543a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -3,7 +3,9 @@ import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Service; @@ -57,6 +59,24 @@ } @Override + public Integer readIsTask(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + return currId; + } + + @Override + public PointNextDTO readEstimateGrid(Long robotId) { + PointNextDTO curr = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId); + return curr; + } + + @Override + public PoseMessageResponseDTO readRobotPoint(Long robotId) { + PoseMessageResponseDTO point = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId); + return point; + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index 2f8eba5..e03b965 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -29,4 +29,11 @@ * @param robotInfo 机器信息 */ void updateSpeed(RobotInfoSetDTO robotInfo); + + /** + * 加载机器人信息至本地 + * + * @param info + */ + void loadPcd(RobotInfo info); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index c491462..c41e16a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -48,5 +50,14 @@ * * @param dto 实体 */ - void pointCallBack(PoseMessageResponseDTO dto,String robotId); + void pointCallBack(PoseMessageResponseDTO dto, String robotId); + + /** + * 图片路径保存 + * + * @param imgDTO + */ + void saveImg(ImgDTO imgDTO); + + void exportDoc(HttpServletResponse response, String taskId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java index 3a22f77..1fc46bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java @@ -70,6 +70,13 @@ } @Override + public List selectListByTaskId(Long id, Long robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("task_id", id); + return list(query); + } + + @Override public boolean getAlarmByTask(Long taskId) { QueryWrapper query = new QueryWrapper<>(); query.eq("task_id", taskId); 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 dccb098..bb7c9d2 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 @@ -44,11 +44,11 @@ List commends = new ArrayList<>(); commends.add(initPath); commends.addAll(initDTO.toArray()); - List res= AlgorithmUtils.invokeJob(commends); + List res = AlgorithmUtils.invokeJob(commends); //判断当前任务是否开启 - AlgorithmResponse response = getAlgorithmResponse(initDTO,res); - if(response.getTaskHeatMap()!=null){ + AlgorithmResponse response = getAlgorithmResponse(initDTO, res); + if (response.getTaskHeatMap() != null) { heatMapService.saveOrUpdateByTaskId(response.getTaskHeatMap()); } return response; @@ -62,22 +62,26 @@ commends.add(planPath); commends.addAll(planDTO.toArray()); List res = AlgorithmUtils.invokeJob(commends); - AlgorithmResponse response = getAlgorithmResponse(planDTO,res); - // + AlgorithmResponse response = getAlgorithmResponse(planDTO, res); + //next 点位编写 + if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + } return response; } - private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO,List res) { + private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO, List res) { File repetitionFile = new File("repetition.txt"); AlgorithmResponse response = new AlgorithmResponse(); if (initDTO.getTaskId() != null && repetitionFile.exists()) { - readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(), res); } else { log.info("taskId is empty!"); } - readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(),res); - readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(), res); + readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(), res); return response; } @@ -88,7 +92,7 @@ * @param response 结果集 * @param taskId 任务ID */ - public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId,List res) { + public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res) { File file = new File(fileName); if (!file.exists()) { log.info("{} file is empty!", fileName); @@ -108,7 +112,7 @@ List xyTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(xyTrains)) { if (CollectionUtil.isNotEmpty(xyTrains)) { - List list = StrUtil.split(xyTrains.get(xyTrains.size()-1), " "); + List list = StrUtil.split(xyTrains.get(xyTrains.size() - 1), " "); response.getPointNextDTO().setX(formatBigDecimal(list.get(0))); response.getPointNextDTO().setY(formatBigDecimal(list.get(1))); } @@ -117,10 +121,10 @@ case "z_train.txt": List zTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(zTrains)) { - String zTrain = zTrains.get(zTrains.size()-1); - response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); + String zTrain = zTrains.get(zTrains.size() - 1); + response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); } - break; + break; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java index ae9e520..fe543a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -3,7 +3,9 @@ import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Service; @@ -57,6 +59,24 @@ } @Override + public Integer readIsTask(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + return currId; + } + + @Override + public PointNextDTO readEstimateGrid(Long robotId) { + PointNextDTO curr = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId); + return curr; + } + + @Override + public PoseMessageResponseDTO readRobotPoint(Long robotId) { + PoseMessageResponseDTO point = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId); + return point; + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c6ecaaa..6925932 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -5,7 +5,6 @@ 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.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -19,10 +18,15 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.utils.PcdDownUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.Serializable; import java.util.List; @@ -42,6 +46,9 @@ private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + @Value("${casic.file.uploadPath}") + private String filePath; + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; @@ -69,6 +76,7 @@ wrapRobotInfo(robotInfo); return robotInfo; } + @Transactional @Override public void updateSpeed(RobotInfoSetDTO robotInfo) { @@ -90,9 +98,16 @@ } update.eq(RobotInfo::getId, robotInfo.getId()); update(update); + } - - + @Override + public void loadPcd(RobotInfo info) { + File file = new File(filePath + "finalCloud_" + info.getId() + ".pcd"); + try { + PcdDownUtil.downPcd(new FileOutputStream(file), info.getPcdDownload()); + } catch (IOException e) { + e.printStackTrace(); + } } @Transactional @@ -106,9 +121,7 @@ void wrapRobotInfo(RobotInfo robotInfo) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("robot_id", robotInfo.getId()); - List robotStatusInfos = robotStatusInfoService.list(wrapper); - if (CollectionUtil.isNotEmpty(robotStatusInfos)) { RobotStatusInfo robotStatusInfo = robotStatusInfos.get(0); robotInfo.setStatusInfo(robotStatusInfos.get(0)); diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index 2f8eba5..e03b965 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -29,4 +29,11 @@ * @param robotInfo 机器信息 */ void updateSpeed(RobotInfoSetDTO robotInfo); + + /** + * 加载机器人信息至本地 + * + * @param info + */ + void loadPcd(RobotInfo info); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index c491462..c41e16a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -48,5 +50,14 @@ * * @param dto 实体 */ - void pointCallBack(PoseMessageResponseDTO dto,String robotId); + void pointCallBack(PoseMessageResponseDTO dto, String robotId); + + /** + * 图片路径保存 + * + * @param imgDTO + */ + void saveImg(ImgDTO imgDTO); + + void exportDoc(HttpServletResponse response, String taskId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java index 3a22f77..1fc46bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java @@ -70,6 +70,13 @@ } @Override + public List selectListByTaskId(Long id, Long robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("task_id", id); + return list(query); + } + + @Override public boolean getAlarmByTask(Long taskId) { QueryWrapper query = new QueryWrapper<>(); query.eq("task_id", taskId); 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 dccb098..bb7c9d2 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 @@ -44,11 +44,11 @@ List commends = new ArrayList<>(); commends.add(initPath); commends.addAll(initDTO.toArray()); - List res= AlgorithmUtils.invokeJob(commends); + List res = AlgorithmUtils.invokeJob(commends); //判断当前任务是否开启 - AlgorithmResponse response = getAlgorithmResponse(initDTO,res); - if(response.getTaskHeatMap()!=null){ + AlgorithmResponse response = getAlgorithmResponse(initDTO, res); + if (response.getTaskHeatMap() != null) { heatMapService.saveOrUpdateByTaskId(response.getTaskHeatMap()); } return response; @@ -62,22 +62,26 @@ commends.add(planPath); commends.addAll(planDTO.toArray()); List res = AlgorithmUtils.invokeJob(commends); - AlgorithmResponse response = getAlgorithmResponse(planDTO,res); - // + AlgorithmResponse response = getAlgorithmResponse(planDTO, res); + //next 点位编写 + if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + } return response; } - private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO,List res) { + private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO, List res) { File repetitionFile = new File("repetition.txt"); AlgorithmResponse response = new AlgorithmResponse(); if (initDTO.getTaskId() != null && repetitionFile.exists()) { - readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(), res); } else { log.info("taskId is empty!"); } - readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(),res); - readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(), res); + readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(), res); return response; } @@ -88,7 +92,7 @@ * @param response 结果集 * @param taskId 任务ID */ - public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId,List res) { + public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res) { File file = new File(fileName); if (!file.exists()) { log.info("{} file is empty!", fileName); @@ -108,7 +112,7 @@ List xyTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(xyTrains)) { if (CollectionUtil.isNotEmpty(xyTrains)) { - List list = StrUtil.split(xyTrains.get(xyTrains.size()-1), " "); + List list = StrUtil.split(xyTrains.get(xyTrains.size() - 1), " "); response.getPointNextDTO().setX(formatBigDecimal(list.get(0))); response.getPointNextDTO().setY(formatBigDecimal(list.get(1))); } @@ -117,10 +121,10 @@ case "z_train.txt": List zTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(zTrains)) { - String zTrain = zTrains.get(zTrains.size()-1); - response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); + String zTrain = zTrains.get(zTrains.size() - 1); + response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); } - break; + break; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java index ae9e520..fe543a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -3,7 +3,9 @@ import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Service; @@ -57,6 +59,24 @@ } @Override + public Integer readIsTask(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + return currId; + } + + @Override + public PointNextDTO readEstimateGrid(Long robotId) { + PointNextDTO curr = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId); + return curr; + } + + @Override + public PoseMessageResponseDTO readRobotPoint(Long robotId) { + PoseMessageResponseDTO point = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId); + return point; + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c6ecaaa..6925932 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -5,7 +5,6 @@ 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.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -19,10 +18,15 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.utils.PcdDownUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.Serializable; import java.util.List; @@ -42,6 +46,9 @@ private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + @Value("${casic.file.uploadPath}") + private String filePath; + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; @@ -69,6 +76,7 @@ wrapRobotInfo(robotInfo); return robotInfo; } + @Transactional @Override public void updateSpeed(RobotInfoSetDTO robotInfo) { @@ -90,9 +98,16 @@ } update.eq(RobotInfo::getId, robotInfo.getId()); update(update); + } - - + @Override + public void loadPcd(RobotInfo info) { + File file = new File(filePath + "finalCloud_" + info.getId() + ".pcd"); + try { + PcdDownUtil.downPcd(new FileOutputStream(file), info.getPcdDownload()); + } catch (IOException e) { + e.printStackTrace(); + } } @Transactional @@ -106,9 +121,7 @@ void wrapRobotInfo(RobotInfo robotInfo) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("robot_id", robotInfo.getId()); - List robotStatusInfos = robotStatusInfoService.list(wrapper); - if (CollectionUtil.isNotEmpty(robotStatusInfos)) { RobotStatusInfo robotStatusInfo = robotStatusInfos.get(0); robotInfo.setStatusInfo(robotStatusInfos.get(0)); 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 54c2c42..7e02ebc 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 @@ -10,6 +10,7 @@ import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; @@ -34,6 +35,7 @@ private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index 2f8eba5..e03b965 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -29,4 +29,11 @@ * @param robotInfo 机器信息 */ void updateSpeed(RobotInfoSetDTO robotInfo); + + /** + * 加载机器人信息至本地 + * + * @param info + */ + void loadPcd(RobotInfo info); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index c491462..c41e16a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -48,5 +50,14 @@ * * @param dto 实体 */ - void pointCallBack(PoseMessageResponseDTO dto,String robotId); + void pointCallBack(PoseMessageResponseDTO dto, String robotId); + + /** + * 图片路径保存 + * + * @param imgDTO + */ + void saveImg(ImgDTO imgDTO); + + void exportDoc(HttpServletResponse response, String taskId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java index 3a22f77..1fc46bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java @@ -70,6 +70,13 @@ } @Override + public List selectListByTaskId(Long id, Long robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("task_id", id); + return list(query); + } + + @Override public boolean getAlarmByTask(Long taskId) { QueryWrapper query = new QueryWrapper<>(); query.eq("task_id", taskId); 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 dccb098..bb7c9d2 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 @@ -44,11 +44,11 @@ List commends = new ArrayList<>(); commends.add(initPath); commends.addAll(initDTO.toArray()); - List res= AlgorithmUtils.invokeJob(commends); + List res = AlgorithmUtils.invokeJob(commends); //判断当前任务是否开启 - AlgorithmResponse response = getAlgorithmResponse(initDTO,res); - if(response.getTaskHeatMap()!=null){ + AlgorithmResponse response = getAlgorithmResponse(initDTO, res); + if (response.getTaskHeatMap() != null) { heatMapService.saveOrUpdateByTaskId(response.getTaskHeatMap()); } return response; @@ -62,22 +62,26 @@ commends.add(planPath); commends.addAll(planDTO.toArray()); List res = AlgorithmUtils.invokeJob(commends); - AlgorithmResponse response = getAlgorithmResponse(planDTO,res); - // + AlgorithmResponse response = getAlgorithmResponse(planDTO, res); + //next 点位编写 + if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + } return response; } - private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO,List res) { + private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO, List res) { File repetitionFile = new File("repetition.txt"); AlgorithmResponse response = new AlgorithmResponse(); if (initDTO.getTaskId() != null && repetitionFile.exists()) { - readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(), res); } else { log.info("taskId is empty!"); } - readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(),res); - readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(), res); + readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(), res); return response; } @@ -88,7 +92,7 @@ * @param response 结果集 * @param taskId 任务ID */ - public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId,List res) { + public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res) { File file = new File(fileName); if (!file.exists()) { log.info("{} file is empty!", fileName); @@ -108,7 +112,7 @@ List xyTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(xyTrains)) { if (CollectionUtil.isNotEmpty(xyTrains)) { - List list = StrUtil.split(xyTrains.get(xyTrains.size()-1), " "); + List list = StrUtil.split(xyTrains.get(xyTrains.size() - 1), " "); response.getPointNextDTO().setX(formatBigDecimal(list.get(0))); response.getPointNextDTO().setY(formatBigDecimal(list.get(1))); } @@ -117,10 +121,10 @@ case "z_train.txt": List zTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(zTrains)) { - String zTrain = zTrains.get(zTrains.size()-1); - response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); + String zTrain = zTrains.get(zTrains.size() - 1); + response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); } - break; + break; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java index ae9e520..fe543a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -3,7 +3,9 @@ import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Service; @@ -57,6 +59,24 @@ } @Override + public Integer readIsTask(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + return currId; + } + + @Override + public PointNextDTO readEstimateGrid(Long robotId) { + PointNextDTO curr = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId); + return curr; + } + + @Override + public PoseMessageResponseDTO readRobotPoint(Long robotId) { + PoseMessageResponseDTO point = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId); + return point; + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c6ecaaa..6925932 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -5,7 +5,6 @@ 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.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -19,10 +18,15 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.utils.PcdDownUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.Serializable; import java.util.List; @@ -42,6 +46,9 @@ private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + @Value("${casic.file.uploadPath}") + private String filePath; + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; @@ -69,6 +76,7 @@ wrapRobotInfo(robotInfo); return robotInfo; } + @Transactional @Override public void updateSpeed(RobotInfoSetDTO robotInfo) { @@ -90,9 +98,16 @@ } update.eq(RobotInfo::getId, robotInfo.getId()); update(update); + } - - + @Override + public void loadPcd(RobotInfo info) { + File file = new File(filePath + "finalCloud_" + info.getId() + ".pcd"); + try { + PcdDownUtil.downPcd(new FileOutputStream(file), info.getPcdDownload()); + } catch (IOException e) { + e.printStackTrace(); + } } @Transactional @@ -106,9 +121,7 @@ void wrapRobotInfo(RobotInfo robotInfo) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("robot_id", robotInfo.getId()); - List robotStatusInfos = robotStatusInfoService.list(wrapper); - if (CollectionUtil.isNotEmpty(robotStatusInfos)) { RobotStatusInfo robotStatusInfo = robotStatusInfos.get(0); robotInfo.setStatusInfo(robotStatusInfos.get(0)); 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 54c2c42..7e02ebc 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 @@ -10,6 +10,7 @@ import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; @@ -34,6 +35,7 @@ private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; 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 468fa88..f26904b 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 @@ -1,38 +1,48 @@ package com.casic.missiles.modular.robot.service.impl; +import cn.afterturn.easypoi.entity.ImageEntity; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +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; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; -import com.casic.missiles.modular.robot.model.RobotInfo; -import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.model.RouteInfo; -import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.*; +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.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import com.casic.missiles.modular.robot.service.*; +import com.casic.missiles.util.WordUtil; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** @@ -54,6 +64,11 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + @Value("${casic.file.uploadPath}") + private String uploadPath; + @Value("${casic.doc.temp}") + private String docTemp; + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; @@ -64,6 +79,33 @@ this.cacheService = cacheService; } + /** + * 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()); + } + + } + @Override public List selectTaskInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectTaskInfoPage(page, query); @@ -73,7 +115,9 @@ @Override public TaskInfo getById(Serializable id) { TaskInfo taskInfo = super.getById(id); - wrapTaskInfo(taskInfo); + if (taskInfo != null) { + wrapTaskInfo(taskInfo); + } return taskInfo; } @@ -91,6 +135,7 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); + taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); } @@ -108,29 +153,53 @@ private void openTask(StartTrackRequest request, String robotId) { QueryWrapper query = new QueryWrapper<>(); query.eq("target_id", request.getTrack_name()); - List routeInfos = routeInfoService.list(query); if (CollectionUtil.isEmpty(routeInfos)) { throw new ServiceException(500, "路线不存在,请及时更新"); } RouteInfo routeInfo = routeInfos.get(0); - + Integer isTask = 0; //开启寻源任务 if (request.getIsTask() == 1) { - //添加任务记录 - TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotId); - //No.3 更新器人执行任务信息 - Long currRouteId = routeInfo.getId(); - Long currTaskId = taskInfo.getId(); - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); - statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); - //算法初始化标志创建 - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); + isTask = 1; } + RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask); + //添加任务记录 + TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotInfo); + //No.3 更新器人执行任务信息 + Long currRouteId = routeInfo.getId(); + Long currTaskId = taskInfo.getId(); + + statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + //算法初始化标志创建 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId, routeInfo.getId()); } + private void closeTask(StartTrackRequest request, String robotId) { + //关闭操作 + RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); + if (statusInfo.getCurrTaskId() != null) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("update_time", new Date()); + updateWrapper.set("task_status", 1); + updateWrapper.set("end_time", new Date()); + updateWrapper.eq("id", statusInfo.getCurrTaskId()); + update(updateWrapper); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + } + + //清空任务缓存 + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + //清空当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + } + /** * 点位上传,执行循迹算法 * @@ -142,23 +211,32 @@ //判定任务是否已经完成初始化 Long longId = Convert.toLong(robotId); Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + //缓存当前点位信息 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId,dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; } + + //读取是否是循迹任务 + Integer isTask = cacheService.readIsTask(longId); + if (isTask != 1) { + log.info("循迹任务,不做处理"); + return; + } + Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); - //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { PathInitDTO pathInitDTO = createInitDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); //中子源计数率读取 - pathInitDTO.setCount(cacheService.getNeutronCount(longId)+""); + pathInitDTO.setCount(cacheService.getNeutronCount(longId) + ""); //执行1次算法 初始化操作 algorithmService.pathPlanningInit(pathInitDTO); } @@ -166,27 +244,149 @@ //No.2 任务执行中 if (taskId != null) { - //算法调用获取热力图 - PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); - //TO-DO 障碍物判定信息 - pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); - //中子源计数率读取 - pathPlanDTO.setCount(cacheService.getNeutronCount(longId)+""); - log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); - algorithmService.pathPlanning(pathPlanDTO); + //判断栅格变化 + GridPointDTO oldPointDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId); + if (oldPointDTO == null || isChange(pointDTO, oldPointDTO)) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO); + //算法调用获取热力图 + PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + //TO-DO 障碍物判定信息 + pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); + //中子源计数率读取 + pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); + log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); + AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - //是否触发寻源操作 - BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); - if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { - log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); - } - - if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { - log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //存储算法估算栅格信息 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); + //是否触发寻源操作 + BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); + if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { + log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); + } + if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { + log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + } } } } + @Override + public void saveImg(ImgDTO imgDTO) { + String path = saveHeatImg(imgDTO.getTaskId()); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + updateWrapper.set(TaskInfo::getHeatImg, path); + updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); + } + + @SneakyThrows + @Transactional + @Override + public void exportDoc(HttpServletResponse response, String taskId) { + TaskInfo info = getById(taskId); + response.setContentType("application/octet-stream"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=report.docx"); + Map params = new HashMap<>(); + //巡检报告_20230101(日期)_065930(时分秒) + String fileName = "巡检报告_" + DateUtil.format(info.getStartTime(), "yyyy-MM-dd") + DateUtil.format(info.getStartTime(), "HH:mm:ss"); + String taskNo = info.getTaskNo() + ""; + String deviceName = "中子源探测设备"; + String taskName = info.getTaskName(); + //固定巡检/自主巡检(默认为固定巡检,若中途切换了自主巡检则改为自主巡检) + String taskType = info.getTaskTypeName(); + //n(计数率高于告警阈值则切换自主巡检,开始告警,每走一步记录一次告警信息 + String alarmNum = info.getAlarmNum() + ""; + //开始时间 + String startTime = DateUtil.format(info.getStartTime(), "yyyy-MM-dd HH:mm:ss"); + String endTime = DateUtil.format(info.getEndTime(), "yyyy-MM-dd HH:mm:ss"); + + params.put("fileName", fileName); + params.put("taskNo", taskNo); + params.put("deviceName", deviceName); + params.put("taskName", taskName); + params.put("taskType", taskType); + params.put("alarmNum", alarmNum); + params.put("startTime", startTime); + params.put("endTime", endTime); + //读取 + List records = recordService.selectListByTaskId(info.getId(), info.getRobotId()); + Integer index = 1; + + if (CollectionUtil.isNotEmpty(records)) { + for (AlarmRecord record : records) { + //栅格信息转换 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + record.setX(pointDTO.getX()); + record.setY(pointDTO.getY()); + record.setIndex(index); + index++; + } + } + + params.put("records", records); + ImageEntity mcaImg = new ImageEntity(); + mcaImg.setHeight(600); + mcaImg.setWidth(600); + mcaImg.setUrl(uploadPath + info.getMcaImg()); + mcaImg.setData(WordUtil.getImageBase64(uploadPath + info.getMcaImg())); + params.put("mcaImg", mcaImg); + + ImageEntity routeImg = new ImageEntity(); + routeImg.setHeight(600); + routeImg.setWidth(600); + routeImg.setUrl(uploadPath + info.getRouteImg()); + routeImg.setData(WordUtil.getImageBase64(uploadPath + info.getRouteImg())); + params.put("routeImg", routeImg); + + ImageEntity heatImg = new ImageEntity(); + heatImg.setHeight(600); + heatImg.setWidth(600); + heatImg.setUrl(uploadPath + info.getHeatImg()); + heatImg.setData(WordUtil.getImageBase64(uploadPath + info.getHeatImg())); + params.put("heatImg", heatImg); + + ImageEntity psdImg = new ImageEntity(); + psdImg.setHeight(500); + psdImg.setWidth(500); + psdImg.setUrl(uploadPath + info.getPsdImg()); + psdImg.setData(WordUtil.getImageBase64(uploadPath + info.getPsdImg())); + params.put("psdImg", psdImg); + + WordUtil.exportOutputStream(docTemp, response.getOutputStream(), params); + } + + private String saveHeatImg(String taskId) { + String newFileName = "task\\" + taskId + ".png"; + //读取当前路径图片 + File file = new File("."); + File[] files = file.listFiles((dir, name) -> name.endsWith(".png") && name.startsWith("step")); + //判定当前执行路径最大step图片 + if (files != null && files.length > 0) { + FileUtil.copy(files[files.length - 1], new File(uploadPath + newFileName), true); + } else { + return ""; + } + return newFileName; + } + + /** + * 是否变化 + * + * @param pointDTO 点位DTO + * @param oldPointDTO 缓存dDTO + * @return + */ + private boolean isChange(GridPointDTO pointDTO, GridPointDTO oldPointDTO) { + if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) { + return false; + } + return true; + } + private PathPlanDTO createPlanDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { PathPlanDTO pathPlanDTO = new PathPlanDTO(); pathPlanDTO.setX(pointDTO.getX().intValue() + ""); @@ -209,7 +409,7 @@ return pathInitDTO; } - private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, String robotId) { + private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, RobotInfo robotInfo) { //No.2 新增任务信息 TaskInfo taskInfo = new TaskInfo(); String currDate = DateUtil.format(new Date(), "yyyyMMdd"); @@ -229,30 +429,13 @@ taskInfo.setTaskStatus(0); taskInfo.setStartTime(new Date()); taskInfo.setRouteId(routeInfo.getId()); - taskInfo.setRobotId(Convert.toLong(robotId)); + taskInfo.setRobotId(robotInfo.getId()); + taskInfo.setGridNumber(robotInfo.getGridNumber()); + taskInfo.setGridSize(robotInfo.getGridSize()); save(taskInfo); return taskInfo; } - private void closeTask(StartTrackRequest request, String robotId) { - //关闭操作 - RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); - if (statusInfo.getCurrTaskId() != null) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("update_time", new Date()); - updateWrapper.set("task_status", 1); - updateWrapper.set("end_time", new Date()); - updateWrapper.eq("id", statusInfo.getCurrTaskId()); - update(updateWrapper); - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); - } - //清空任务缓存 - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); - } - @Override public List getTaskListByStatus(Integer status, Integer taskType, Integer discernType) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -261,5 +444,4 @@ queryWrapper.eq(null != discernType, "discern_type", discernType); return this.list(queryWrapper); } - } \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index 2f8eba5..e03b965 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -29,4 +29,11 @@ * @param robotInfo 机器信息 */ void updateSpeed(RobotInfoSetDTO robotInfo); + + /** + * 加载机器人信息至本地 + * + * @param info + */ + void loadPcd(RobotInfo info); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index c491462..c41e16a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -48,5 +50,14 @@ * * @param dto 实体 */ - void pointCallBack(PoseMessageResponseDTO dto,String robotId); + void pointCallBack(PoseMessageResponseDTO dto, String robotId); + + /** + * 图片路径保存 + * + * @param imgDTO + */ + void saveImg(ImgDTO imgDTO); + + void exportDoc(HttpServletResponse response, String taskId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java index 3a22f77..1fc46bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java @@ -70,6 +70,13 @@ } @Override + public List selectListByTaskId(Long id, Long robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("task_id", id); + return list(query); + } + + @Override public boolean getAlarmByTask(Long taskId) { QueryWrapper query = new QueryWrapper<>(); query.eq("task_id", taskId); 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 dccb098..bb7c9d2 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 @@ -44,11 +44,11 @@ List commends = new ArrayList<>(); commends.add(initPath); commends.addAll(initDTO.toArray()); - List res= AlgorithmUtils.invokeJob(commends); + List res = AlgorithmUtils.invokeJob(commends); //判断当前任务是否开启 - AlgorithmResponse response = getAlgorithmResponse(initDTO,res); - if(response.getTaskHeatMap()!=null){ + AlgorithmResponse response = getAlgorithmResponse(initDTO, res); + if (response.getTaskHeatMap() != null) { heatMapService.saveOrUpdateByTaskId(response.getTaskHeatMap()); } return response; @@ -62,22 +62,26 @@ commends.add(planPath); commends.addAll(planDTO.toArray()); List res = AlgorithmUtils.invokeJob(commends); - AlgorithmResponse response = getAlgorithmResponse(planDTO,res); - // + AlgorithmResponse response = getAlgorithmResponse(planDTO, res); + //next 点位编写 + if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + } return response; } - private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO,List res) { + private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO, List res) { File repetitionFile = new File("repetition.txt"); AlgorithmResponse response = new AlgorithmResponse(); if (initDTO.getTaskId() != null && repetitionFile.exists()) { - readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(), res); } else { log.info("taskId is empty!"); } - readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(),res); - readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(), res); + readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(), res); return response; } @@ -88,7 +92,7 @@ * @param response 结果集 * @param taskId 任务ID */ - public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId,List res) { + public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res) { File file = new File(fileName); if (!file.exists()) { log.info("{} file is empty!", fileName); @@ -108,7 +112,7 @@ List xyTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(xyTrains)) { if (CollectionUtil.isNotEmpty(xyTrains)) { - List list = StrUtil.split(xyTrains.get(xyTrains.size()-1), " "); + List list = StrUtil.split(xyTrains.get(xyTrains.size() - 1), " "); response.getPointNextDTO().setX(formatBigDecimal(list.get(0))); response.getPointNextDTO().setY(formatBigDecimal(list.get(1))); } @@ -117,10 +121,10 @@ case "z_train.txt": List zTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(zTrains)) { - String zTrain = zTrains.get(zTrains.size()-1); - response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); + String zTrain = zTrains.get(zTrains.size() - 1); + response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); } - break; + break; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java index ae9e520..fe543a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -3,7 +3,9 @@ import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Service; @@ -57,6 +59,24 @@ } @Override + public Integer readIsTask(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + return currId; + } + + @Override + public PointNextDTO readEstimateGrid(Long robotId) { + PointNextDTO curr = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId); + return curr; + } + + @Override + public PoseMessageResponseDTO readRobotPoint(Long robotId) { + PoseMessageResponseDTO point = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId); + return point; + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c6ecaaa..6925932 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -5,7 +5,6 @@ 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.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -19,10 +18,15 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.utils.PcdDownUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.Serializable; import java.util.List; @@ -42,6 +46,9 @@ private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + @Value("${casic.file.uploadPath}") + private String filePath; + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; @@ -69,6 +76,7 @@ wrapRobotInfo(robotInfo); return robotInfo; } + @Transactional @Override public void updateSpeed(RobotInfoSetDTO robotInfo) { @@ -90,9 +98,16 @@ } update.eq(RobotInfo::getId, robotInfo.getId()); update(update); + } - - + @Override + public void loadPcd(RobotInfo info) { + File file = new File(filePath + "finalCloud_" + info.getId() + ".pcd"); + try { + PcdDownUtil.downPcd(new FileOutputStream(file), info.getPcdDownload()); + } catch (IOException e) { + e.printStackTrace(); + } } @Transactional @@ -106,9 +121,7 @@ void wrapRobotInfo(RobotInfo robotInfo) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("robot_id", robotInfo.getId()); - List robotStatusInfos = robotStatusInfoService.list(wrapper); - if (CollectionUtil.isNotEmpty(robotStatusInfos)) { RobotStatusInfo robotStatusInfo = robotStatusInfos.get(0); robotInfo.setStatusInfo(robotStatusInfos.get(0)); 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 54c2c42..7e02ebc 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 @@ -10,6 +10,7 @@ import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; @@ -34,6 +35,7 @@ private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; 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 468fa88..f26904b 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 @@ -1,38 +1,48 @@ package com.casic.missiles.modular.robot.service.impl; +import cn.afterturn.easypoi.entity.ImageEntity; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +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; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; -import com.casic.missiles.modular.robot.model.RobotInfo; -import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.model.RouteInfo; -import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.*; +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.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import com.casic.missiles.modular.robot.service.*; +import com.casic.missiles.util.WordUtil; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** @@ -54,6 +64,11 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + @Value("${casic.file.uploadPath}") + private String uploadPath; + @Value("${casic.doc.temp}") + private String docTemp; + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; @@ -64,6 +79,33 @@ this.cacheService = cacheService; } + /** + * 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()); + } + + } + @Override public List selectTaskInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectTaskInfoPage(page, query); @@ -73,7 +115,9 @@ @Override public TaskInfo getById(Serializable id) { TaskInfo taskInfo = super.getById(id); - wrapTaskInfo(taskInfo); + if (taskInfo != null) { + wrapTaskInfo(taskInfo); + } return taskInfo; } @@ -91,6 +135,7 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); + taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); } @@ -108,29 +153,53 @@ private void openTask(StartTrackRequest request, String robotId) { QueryWrapper query = new QueryWrapper<>(); query.eq("target_id", request.getTrack_name()); - List routeInfos = routeInfoService.list(query); if (CollectionUtil.isEmpty(routeInfos)) { throw new ServiceException(500, "路线不存在,请及时更新"); } RouteInfo routeInfo = routeInfos.get(0); - + Integer isTask = 0; //开启寻源任务 if (request.getIsTask() == 1) { - //添加任务记录 - TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotId); - //No.3 更新器人执行任务信息 - Long currRouteId = routeInfo.getId(); - Long currTaskId = taskInfo.getId(); - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); - statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); - //算法初始化标志创建 - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); + isTask = 1; } + RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask); + //添加任务记录 + TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotInfo); + //No.3 更新器人执行任务信息 + Long currRouteId = routeInfo.getId(); + Long currTaskId = taskInfo.getId(); + + statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + //算法初始化标志创建 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId, routeInfo.getId()); } + private void closeTask(StartTrackRequest request, String robotId) { + //关闭操作 + RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); + if (statusInfo.getCurrTaskId() != null) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("update_time", new Date()); + updateWrapper.set("task_status", 1); + updateWrapper.set("end_time", new Date()); + updateWrapper.eq("id", statusInfo.getCurrTaskId()); + update(updateWrapper); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + } + + //清空任务缓存 + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + //清空当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + } + /** * 点位上传,执行循迹算法 * @@ -142,23 +211,32 @@ //判定任务是否已经完成初始化 Long longId = Convert.toLong(robotId); Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + //缓存当前点位信息 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId,dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; } + + //读取是否是循迹任务 + Integer isTask = cacheService.readIsTask(longId); + if (isTask != 1) { + log.info("循迹任务,不做处理"); + return; + } + Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); - //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { PathInitDTO pathInitDTO = createInitDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); //中子源计数率读取 - pathInitDTO.setCount(cacheService.getNeutronCount(longId)+""); + pathInitDTO.setCount(cacheService.getNeutronCount(longId) + ""); //执行1次算法 初始化操作 algorithmService.pathPlanningInit(pathInitDTO); } @@ -166,27 +244,149 @@ //No.2 任务执行中 if (taskId != null) { - //算法调用获取热力图 - PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); - //TO-DO 障碍物判定信息 - pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); - //中子源计数率读取 - pathPlanDTO.setCount(cacheService.getNeutronCount(longId)+""); - log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); - algorithmService.pathPlanning(pathPlanDTO); + //判断栅格变化 + GridPointDTO oldPointDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId); + if (oldPointDTO == null || isChange(pointDTO, oldPointDTO)) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO); + //算法调用获取热力图 + PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + //TO-DO 障碍物判定信息 + pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); + //中子源计数率读取 + pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); + log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); + AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - //是否触发寻源操作 - BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); - if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { - log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); - } - - if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { - log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //存储算法估算栅格信息 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); + //是否触发寻源操作 + BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); + if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { + log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); + } + if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { + log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + } } } } + @Override + public void saveImg(ImgDTO imgDTO) { + String path = saveHeatImg(imgDTO.getTaskId()); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + updateWrapper.set(TaskInfo::getHeatImg, path); + updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); + } + + @SneakyThrows + @Transactional + @Override + public void exportDoc(HttpServletResponse response, String taskId) { + TaskInfo info = getById(taskId); + response.setContentType("application/octet-stream"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=report.docx"); + Map params = new HashMap<>(); + //巡检报告_20230101(日期)_065930(时分秒) + String fileName = "巡检报告_" + DateUtil.format(info.getStartTime(), "yyyy-MM-dd") + DateUtil.format(info.getStartTime(), "HH:mm:ss"); + String taskNo = info.getTaskNo() + ""; + String deviceName = "中子源探测设备"; + String taskName = info.getTaskName(); + //固定巡检/自主巡检(默认为固定巡检,若中途切换了自主巡检则改为自主巡检) + String taskType = info.getTaskTypeName(); + //n(计数率高于告警阈值则切换自主巡检,开始告警,每走一步记录一次告警信息 + String alarmNum = info.getAlarmNum() + ""; + //开始时间 + String startTime = DateUtil.format(info.getStartTime(), "yyyy-MM-dd HH:mm:ss"); + String endTime = DateUtil.format(info.getEndTime(), "yyyy-MM-dd HH:mm:ss"); + + params.put("fileName", fileName); + params.put("taskNo", taskNo); + params.put("deviceName", deviceName); + params.put("taskName", taskName); + params.put("taskType", taskType); + params.put("alarmNum", alarmNum); + params.put("startTime", startTime); + params.put("endTime", endTime); + //读取 + List records = recordService.selectListByTaskId(info.getId(), info.getRobotId()); + Integer index = 1; + + if (CollectionUtil.isNotEmpty(records)) { + for (AlarmRecord record : records) { + //栅格信息转换 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + record.setX(pointDTO.getX()); + record.setY(pointDTO.getY()); + record.setIndex(index); + index++; + } + } + + params.put("records", records); + ImageEntity mcaImg = new ImageEntity(); + mcaImg.setHeight(600); + mcaImg.setWidth(600); + mcaImg.setUrl(uploadPath + info.getMcaImg()); + mcaImg.setData(WordUtil.getImageBase64(uploadPath + info.getMcaImg())); + params.put("mcaImg", mcaImg); + + ImageEntity routeImg = new ImageEntity(); + routeImg.setHeight(600); + routeImg.setWidth(600); + routeImg.setUrl(uploadPath + info.getRouteImg()); + routeImg.setData(WordUtil.getImageBase64(uploadPath + info.getRouteImg())); + params.put("routeImg", routeImg); + + ImageEntity heatImg = new ImageEntity(); + heatImg.setHeight(600); + heatImg.setWidth(600); + heatImg.setUrl(uploadPath + info.getHeatImg()); + heatImg.setData(WordUtil.getImageBase64(uploadPath + info.getHeatImg())); + params.put("heatImg", heatImg); + + ImageEntity psdImg = new ImageEntity(); + psdImg.setHeight(500); + psdImg.setWidth(500); + psdImg.setUrl(uploadPath + info.getPsdImg()); + psdImg.setData(WordUtil.getImageBase64(uploadPath + info.getPsdImg())); + params.put("psdImg", psdImg); + + WordUtil.exportOutputStream(docTemp, response.getOutputStream(), params); + } + + private String saveHeatImg(String taskId) { + String newFileName = "task\\" + taskId + ".png"; + //读取当前路径图片 + File file = new File("."); + File[] files = file.listFiles((dir, name) -> name.endsWith(".png") && name.startsWith("step")); + //判定当前执行路径最大step图片 + if (files != null && files.length > 0) { + FileUtil.copy(files[files.length - 1], new File(uploadPath + newFileName), true); + } else { + return ""; + } + return newFileName; + } + + /** + * 是否变化 + * + * @param pointDTO 点位DTO + * @param oldPointDTO 缓存dDTO + * @return + */ + private boolean isChange(GridPointDTO pointDTO, GridPointDTO oldPointDTO) { + if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) { + return false; + } + return true; + } + private PathPlanDTO createPlanDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { PathPlanDTO pathPlanDTO = new PathPlanDTO(); pathPlanDTO.setX(pointDTO.getX().intValue() + ""); @@ -209,7 +409,7 @@ return pathInitDTO; } - private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, String robotId) { + private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, RobotInfo robotInfo) { //No.2 新增任务信息 TaskInfo taskInfo = new TaskInfo(); String currDate = DateUtil.format(new Date(), "yyyyMMdd"); @@ -229,30 +429,13 @@ taskInfo.setTaskStatus(0); taskInfo.setStartTime(new Date()); taskInfo.setRouteId(routeInfo.getId()); - taskInfo.setRobotId(Convert.toLong(robotId)); + taskInfo.setRobotId(robotInfo.getId()); + taskInfo.setGridNumber(robotInfo.getGridNumber()); + taskInfo.setGridSize(robotInfo.getGridSize()); save(taskInfo); return taskInfo; } - private void closeTask(StartTrackRequest request, String robotId) { - //关闭操作 - RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); - if (statusInfo.getCurrTaskId() != null) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("update_time", new Date()); - updateWrapper.set("task_status", 1); - updateWrapper.set("end_time", new Date()); - updateWrapper.eq("id", statusInfo.getCurrTaskId()); - update(updateWrapper); - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); - } - //清空任务缓存 - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); - } - @Override public List getTaskListByStatus(Integer status, Integer taskType, Integer discernType) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -261,5 +444,4 @@ queryWrapper.eq(null != discernType, "discern_type", discernType); return this.list(queryWrapper); } - } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java index e296f3d..06c8bc0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java @@ -12,7 +12,6 @@ */ public class PcdDownUtil { public static void downPcd(HttpServletResponse response, String urlPath) throws IOException { - response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); OutputStream outputStream = null; @@ -44,4 +43,31 @@ } } + public static void downPcd(OutputStream outputStream, String urlPath) throws IOException { + InputStream inputStream = null; + try { + // 这里URLEncoder.encode可以防止中文乱码 当然和easyExcel没有关系 + URL url = new URL(urlPath); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.connect(); + inputStream = connection.getInputStream(); + //写流操作 + int bytesRead; + byte[] buffer = new byte[8192]; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + inputStream.close(); + } + if (outputStream != null) { + outputStream.close(); + } + } + + } } \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index 2f8eba5..e03b965 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -29,4 +29,11 @@ * @param robotInfo 机器信息 */ void updateSpeed(RobotInfoSetDTO robotInfo); + + /** + * 加载机器人信息至本地 + * + * @param info + */ + void loadPcd(RobotInfo info); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index c491462..c41e16a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -48,5 +50,14 @@ * * @param dto 实体 */ - void pointCallBack(PoseMessageResponseDTO dto,String robotId); + void pointCallBack(PoseMessageResponseDTO dto, String robotId); + + /** + * 图片路径保存 + * + * @param imgDTO + */ + void saveImg(ImgDTO imgDTO); + + void exportDoc(HttpServletResponse response, String taskId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java index 3a22f77..1fc46bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java @@ -70,6 +70,13 @@ } @Override + public List selectListByTaskId(Long id, Long robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("task_id", id); + return list(query); + } + + @Override public boolean getAlarmByTask(Long taskId) { QueryWrapper query = new QueryWrapper<>(); query.eq("task_id", taskId); 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 dccb098..bb7c9d2 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 @@ -44,11 +44,11 @@ List commends = new ArrayList<>(); commends.add(initPath); commends.addAll(initDTO.toArray()); - List res= AlgorithmUtils.invokeJob(commends); + List res = AlgorithmUtils.invokeJob(commends); //判断当前任务是否开启 - AlgorithmResponse response = getAlgorithmResponse(initDTO,res); - if(response.getTaskHeatMap()!=null){ + AlgorithmResponse response = getAlgorithmResponse(initDTO, res); + if (response.getTaskHeatMap() != null) { heatMapService.saveOrUpdateByTaskId(response.getTaskHeatMap()); } return response; @@ -62,22 +62,26 @@ commends.add(planPath); commends.addAll(planDTO.toArray()); List res = AlgorithmUtils.invokeJob(commends); - AlgorithmResponse response = getAlgorithmResponse(planDTO,res); - // + AlgorithmResponse response = getAlgorithmResponse(planDTO, res); + //next 点位编写 + if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + } return response; } - private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO,List res) { + private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO, List res) { File repetitionFile = new File("repetition.txt"); AlgorithmResponse response = new AlgorithmResponse(); if (initDTO.getTaskId() != null && repetitionFile.exists()) { - readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(), res); } else { log.info("taskId is empty!"); } - readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(),res); - readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(), res); + readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(), res); return response; } @@ -88,7 +92,7 @@ * @param response 结果集 * @param taskId 任务ID */ - public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId,List res) { + public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res) { File file = new File(fileName); if (!file.exists()) { log.info("{} file is empty!", fileName); @@ -108,7 +112,7 @@ List xyTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(xyTrains)) { if (CollectionUtil.isNotEmpty(xyTrains)) { - List list = StrUtil.split(xyTrains.get(xyTrains.size()-1), " "); + List list = StrUtil.split(xyTrains.get(xyTrains.size() - 1), " "); response.getPointNextDTO().setX(formatBigDecimal(list.get(0))); response.getPointNextDTO().setY(formatBigDecimal(list.get(1))); } @@ -117,10 +121,10 @@ case "z_train.txt": List zTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(zTrains)) { - String zTrain = zTrains.get(zTrains.size()-1); - response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); + String zTrain = zTrains.get(zTrains.size() - 1); + response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); } - break; + break; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java index ae9e520..fe543a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -3,7 +3,9 @@ import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Service; @@ -57,6 +59,24 @@ } @Override + public Integer readIsTask(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + return currId; + } + + @Override + public PointNextDTO readEstimateGrid(Long robotId) { + PointNextDTO curr = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId); + return curr; + } + + @Override + public PoseMessageResponseDTO readRobotPoint(Long robotId) { + PoseMessageResponseDTO point = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId); + return point; + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c6ecaaa..6925932 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -5,7 +5,6 @@ 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.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -19,10 +18,15 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.utils.PcdDownUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.Serializable; import java.util.List; @@ -42,6 +46,9 @@ private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + @Value("${casic.file.uploadPath}") + private String filePath; + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; @@ -69,6 +76,7 @@ wrapRobotInfo(robotInfo); return robotInfo; } + @Transactional @Override public void updateSpeed(RobotInfoSetDTO robotInfo) { @@ -90,9 +98,16 @@ } update.eq(RobotInfo::getId, robotInfo.getId()); update(update); + } - - + @Override + public void loadPcd(RobotInfo info) { + File file = new File(filePath + "finalCloud_" + info.getId() + ".pcd"); + try { + PcdDownUtil.downPcd(new FileOutputStream(file), info.getPcdDownload()); + } catch (IOException e) { + e.printStackTrace(); + } } @Transactional @@ -106,9 +121,7 @@ void wrapRobotInfo(RobotInfo robotInfo) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("robot_id", robotInfo.getId()); - List robotStatusInfos = robotStatusInfoService.list(wrapper); - if (CollectionUtil.isNotEmpty(robotStatusInfos)) { RobotStatusInfo robotStatusInfo = robotStatusInfos.get(0); robotInfo.setStatusInfo(robotStatusInfos.get(0)); 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 54c2c42..7e02ebc 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 @@ -10,6 +10,7 @@ import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; @@ -34,6 +35,7 @@ private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; 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 468fa88..f26904b 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 @@ -1,38 +1,48 @@ package com.casic.missiles.modular.robot.service.impl; +import cn.afterturn.easypoi.entity.ImageEntity; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +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; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; -import com.casic.missiles.modular.robot.model.RobotInfo; -import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.model.RouteInfo; -import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.*; +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.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import com.casic.missiles.modular.robot.service.*; +import com.casic.missiles.util.WordUtil; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** @@ -54,6 +64,11 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + @Value("${casic.file.uploadPath}") + private String uploadPath; + @Value("${casic.doc.temp}") + private String docTemp; + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; @@ -64,6 +79,33 @@ this.cacheService = cacheService; } + /** + * 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()); + } + + } + @Override public List selectTaskInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectTaskInfoPage(page, query); @@ -73,7 +115,9 @@ @Override public TaskInfo getById(Serializable id) { TaskInfo taskInfo = super.getById(id); - wrapTaskInfo(taskInfo); + if (taskInfo != null) { + wrapTaskInfo(taskInfo); + } return taskInfo; } @@ -91,6 +135,7 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); + taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); } @@ -108,29 +153,53 @@ private void openTask(StartTrackRequest request, String robotId) { QueryWrapper query = new QueryWrapper<>(); query.eq("target_id", request.getTrack_name()); - List routeInfos = routeInfoService.list(query); if (CollectionUtil.isEmpty(routeInfos)) { throw new ServiceException(500, "路线不存在,请及时更新"); } RouteInfo routeInfo = routeInfos.get(0); - + Integer isTask = 0; //开启寻源任务 if (request.getIsTask() == 1) { - //添加任务记录 - TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotId); - //No.3 更新器人执行任务信息 - Long currRouteId = routeInfo.getId(); - Long currTaskId = taskInfo.getId(); - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); - statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); - //算法初始化标志创建 - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); + isTask = 1; } + RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask); + //添加任务记录 + TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotInfo); + //No.3 更新器人执行任务信息 + Long currRouteId = routeInfo.getId(); + Long currTaskId = taskInfo.getId(); + + statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + //算法初始化标志创建 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId, routeInfo.getId()); } + private void closeTask(StartTrackRequest request, String robotId) { + //关闭操作 + RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); + if (statusInfo.getCurrTaskId() != null) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("update_time", new Date()); + updateWrapper.set("task_status", 1); + updateWrapper.set("end_time", new Date()); + updateWrapper.eq("id", statusInfo.getCurrTaskId()); + update(updateWrapper); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + } + + //清空任务缓存 + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + //清空当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + } + /** * 点位上传,执行循迹算法 * @@ -142,23 +211,32 @@ //判定任务是否已经完成初始化 Long longId = Convert.toLong(robotId); Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + //缓存当前点位信息 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId,dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; } + + //读取是否是循迹任务 + Integer isTask = cacheService.readIsTask(longId); + if (isTask != 1) { + log.info("循迹任务,不做处理"); + return; + } + Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); - //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { PathInitDTO pathInitDTO = createInitDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); //中子源计数率读取 - pathInitDTO.setCount(cacheService.getNeutronCount(longId)+""); + pathInitDTO.setCount(cacheService.getNeutronCount(longId) + ""); //执行1次算法 初始化操作 algorithmService.pathPlanningInit(pathInitDTO); } @@ -166,27 +244,149 @@ //No.2 任务执行中 if (taskId != null) { - //算法调用获取热力图 - PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); - //TO-DO 障碍物判定信息 - pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); - //中子源计数率读取 - pathPlanDTO.setCount(cacheService.getNeutronCount(longId)+""); - log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); - algorithmService.pathPlanning(pathPlanDTO); + //判断栅格变化 + GridPointDTO oldPointDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId); + if (oldPointDTO == null || isChange(pointDTO, oldPointDTO)) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO); + //算法调用获取热力图 + PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + //TO-DO 障碍物判定信息 + pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); + //中子源计数率读取 + pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); + log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); + AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - //是否触发寻源操作 - BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); - if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { - log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); - } - - if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { - log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //存储算法估算栅格信息 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); + //是否触发寻源操作 + BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); + if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { + log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); + } + if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { + log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + } } } } + @Override + public void saveImg(ImgDTO imgDTO) { + String path = saveHeatImg(imgDTO.getTaskId()); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + updateWrapper.set(TaskInfo::getHeatImg, path); + updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); + } + + @SneakyThrows + @Transactional + @Override + public void exportDoc(HttpServletResponse response, String taskId) { + TaskInfo info = getById(taskId); + response.setContentType("application/octet-stream"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=report.docx"); + Map params = new HashMap<>(); + //巡检报告_20230101(日期)_065930(时分秒) + String fileName = "巡检报告_" + DateUtil.format(info.getStartTime(), "yyyy-MM-dd") + DateUtil.format(info.getStartTime(), "HH:mm:ss"); + String taskNo = info.getTaskNo() + ""; + String deviceName = "中子源探测设备"; + String taskName = info.getTaskName(); + //固定巡检/自主巡检(默认为固定巡检,若中途切换了自主巡检则改为自主巡检) + String taskType = info.getTaskTypeName(); + //n(计数率高于告警阈值则切换自主巡检,开始告警,每走一步记录一次告警信息 + String alarmNum = info.getAlarmNum() + ""; + //开始时间 + String startTime = DateUtil.format(info.getStartTime(), "yyyy-MM-dd HH:mm:ss"); + String endTime = DateUtil.format(info.getEndTime(), "yyyy-MM-dd HH:mm:ss"); + + params.put("fileName", fileName); + params.put("taskNo", taskNo); + params.put("deviceName", deviceName); + params.put("taskName", taskName); + params.put("taskType", taskType); + params.put("alarmNum", alarmNum); + params.put("startTime", startTime); + params.put("endTime", endTime); + //读取 + List records = recordService.selectListByTaskId(info.getId(), info.getRobotId()); + Integer index = 1; + + if (CollectionUtil.isNotEmpty(records)) { + for (AlarmRecord record : records) { + //栅格信息转换 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + record.setX(pointDTO.getX()); + record.setY(pointDTO.getY()); + record.setIndex(index); + index++; + } + } + + params.put("records", records); + ImageEntity mcaImg = new ImageEntity(); + mcaImg.setHeight(600); + mcaImg.setWidth(600); + mcaImg.setUrl(uploadPath + info.getMcaImg()); + mcaImg.setData(WordUtil.getImageBase64(uploadPath + info.getMcaImg())); + params.put("mcaImg", mcaImg); + + ImageEntity routeImg = new ImageEntity(); + routeImg.setHeight(600); + routeImg.setWidth(600); + routeImg.setUrl(uploadPath + info.getRouteImg()); + routeImg.setData(WordUtil.getImageBase64(uploadPath + info.getRouteImg())); + params.put("routeImg", routeImg); + + ImageEntity heatImg = new ImageEntity(); + heatImg.setHeight(600); + heatImg.setWidth(600); + heatImg.setUrl(uploadPath + info.getHeatImg()); + heatImg.setData(WordUtil.getImageBase64(uploadPath + info.getHeatImg())); + params.put("heatImg", heatImg); + + ImageEntity psdImg = new ImageEntity(); + psdImg.setHeight(500); + psdImg.setWidth(500); + psdImg.setUrl(uploadPath + info.getPsdImg()); + psdImg.setData(WordUtil.getImageBase64(uploadPath + info.getPsdImg())); + params.put("psdImg", psdImg); + + WordUtil.exportOutputStream(docTemp, response.getOutputStream(), params); + } + + private String saveHeatImg(String taskId) { + String newFileName = "task\\" + taskId + ".png"; + //读取当前路径图片 + File file = new File("."); + File[] files = file.listFiles((dir, name) -> name.endsWith(".png") && name.startsWith("step")); + //判定当前执行路径最大step图片 + if (files != null && files.length > 0) { + FileUtil.copy(files[files.length - 1], new File(uploadPath + newFileName), true); + } else { + return ""; + } + return newFileName; + } + + /** + * 是否变化 + * + * @param pointDTO 点位DTO + * @param oldPointDTO 缓存dDTO + * @return + */ + private boolean isChange(GridPointDTO pointDTO, GridPointDTO oldPointDTO) { + if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) { + return false; + } + return true; + } + private PathPlanDTO createPlanDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { PathPlanDTO pathPlanDTO = new PathPlanDTO(); pathPlanDTO.setX(pointDTO.getX().intValue() + ""); @@ -209,7 +409,7 @@ return pathInitDTO; } - private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, String robotId) { + private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, RobotInfo robotInfo) { //No.2 新增任务信息 TaskInfo taskInfo = new TaskInfo(); String currDate = DateUtil.format(new Date(), "yyyyMMdd"); @@ -229,30 +429,13 @@ taskInfo.setTaskStatus(0); taskInfo.setStartTime(new Date()); taskInfo.setRouteId(routeInfo.getId()); - taskInfo.setRobotId(Convert.toLong(robotId)); + taskInfo.setRobotId(robotInfo.getId()); + taskInfo.setGridNumber(robotInfo.getGridNumber()); + taskInfo.setGridSize(robotInfo.getGridSize()); save(taskInfo); return taskInfo; } - private void closeTask(StartTrackRequest request, String robotId) { - //关闭操作 - RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); - if (statusInfo.getCurrTaskId() != null) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("update_time", new Date()); - updateWrapper.set("task_status", 1); - updateWrapper.set("end_time", new Date()); - updateWrapper.eq("id", statusInfo.getCurrTaskId()); - update(updateWrapper); - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); - } - //清空任务缓存 - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); - } - @Override public List getTaskListByStatus(Integer status, Integer taskType, Integer discernType) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -261,5 +444,4 @@ queryWrapper.eq(null != discernType, "discern_type", discernType); return this.list(queryWrapper); } - } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java index e296f3d..06c8bc0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java @@ -12,7 +12,6 @@ */ public class PcdDownUtil { public static void downPcd(HttpServletResponse response, String urlPath) throws IOException { - response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); OutputStream outputStream = null; @@ -44,4 +43,31 @@ } } + public static void downPcd(OutputStream outputStream, String urlPath) throws IOException { + InputStream inputStream = null; + try { + // 这里URLEncoder.encode可以防止中文乱码 当然和easyExcel没有关系 + URL url = new URL(urlPath); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.connect(); + inputStream = connection.getInputStream(); + //写流操作 + int bytesRead; + byte[] buffer = new byte[8192]; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + inputStream.close(); + } + if (outputStream != null) { + outputStream.close(); + } + } + + } } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/util/WordUtil.java b/casic-server/src/main/java/com/casic/missiles/util/WordUtil.java new file mode 100644 index 0000000..70c7be7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/util/WordUtil.java @@ -0,0 +1,136 @@ +package com.casic.missiles.util; + +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import java.io.*; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class WordUtil { + public void imageWordExport() { + Map map = new HashMap(); + map.put("department", "Easypoi"); + map.put("person", "JueYue"); + map.put("time", DateUtil.format(new Date(), "yyyy-MM-dd")); + ImageEntity image = new ImageEntity(); + image.setHeight(200); + image.setWidth(500); + image.setUrl("cn/afterturn/easypoi/test/word/img/testCode.png"); + image.setType(ImageEntity.URL); + map.put("testCode", image); + try { + XWPFDocument doc = WordExportUtil.exportWord07( + "cn/afterturn/easypoi/test/word/doc/Image.docx", map); + FileOutputStream fos = new FileOutputStream("D:/excel/image.docx"); + doc.write(fos); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 简单导出没有图片和Excel + */ + public static void SimpleWordExport() { + Map map = new HashMap(); + map.put("department", "Easypoi"); + map.put("person", "JueYue"); + map.put("time", DateUtil.format(new Date(), "yyyy-MM-dd")); + map.put("me", "JueYue"); + map.put("date", "2015-01-03"); + try { + + XWPFDocument doc = WordExportUtil.exportWord07("simple.docx", map); + FileOutputStream fos = new FileOutputStream("C:/excel/simple.docx"); + doc.write(fos); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) throws IOException { +// SimpleWordExport(); + String basePath = "D:\\workspace\\server\\keti\\casic-robot-inspection\\casic-web\\src\\main\\resources\\config\\path\\"; + String tempPath = basePath + "report.docx"; + Map params = new HashMap<>(); + params.put("x", "123"); + + ImageEntity image = new ImageEntity(); + image.setHeight(500); + image.setWidth(500); + image.setUrl(basePath + "routeImg.png"); + image.setData(getImageBase64(basePath + "2.png")); + + params.put("image", image); + exportWord(tempPath, basePath, "X.docx", params); + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + public static void exportOutputStream(String templatePath, OutputStream fos, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index 2f8eba5..e03b965 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -29,4 +29,11 @@ * @param robotInfo 机器信息 */ void updateSpeed(RobotInfoSetDTO robotInfo); + + /** + * 加载机器人信息至本地 + * + * @param info + */ + void loadPcd(RobotInfo info); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index c491462..c41e16a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -48,5 +50,14 @@ * * @param dto 实体 */ - void pointCallBack(PoseMessageResponseDTO dto,String robotId); + void pointCallBack(PoseMessageResponseDTO dto, String robotId); + + /** + * 图片路径保存 + * + * @param imgDTO + */ + void saveImg(ImgDTO imgDTO); + + void exportDoc(HttpServletResponse response, String taskId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java index 3a22f77..1fc46bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java @@ -70,6 +70,13 @@ } @Override + public List selectListByTaskId(Long id, Long robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("task_id", id); + return list(query); + } + + @Override public boolean getAlarmByTask(Long taskId) { QueryWrapper query = new QueryWrapper<>(); query.eq("task_id", taskId); 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 dccb098..bb7c9d2 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 @@ -44,11 +44,11 @@ List commends = new ArrayList<>(); commends.add(initPath); commends.addAll(initDTO.toArray()); - List res= AlgorithmUtils.invokeJob(commends); + List res = AlgorithmUtils.invokeJob(commends); //判断当前任务是否开启 - AlgorithmResponse response = getAlgorithmResponse(initDTO,res); - if(response.getTaskHeatMap()!=null){ + AlgorithmResponse response = getAlgorithmResponse(initDTO, res); + if (response.getTaskHeatMap() != null) { heatMapService.saveOrUpdateByTaskId(response.getTaskHeatMap()); } return response; @@ -62,22 +62,26 @@ commends.add(planPath); commends.addAll(planDTO.toArray()); List res = AlgorithmUtils.invokeJob(commends); - AlgorithmResponse response = getAlgorithmResponse(planDTO,res); - // + AlgorithmResponse response = getAlgorithmResponse(planDTO, res); + //next 点位编写 + if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + } return response; } - private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO,List res) { + private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO, List res) { File repetitionFile = new File("repetition.txt"); AlgorithmResponse response = new AlgorithmResponse(); if (initDTO.getTaskId() != null && repetitionFile.exists()) { - readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(), res); } else { log.info("taskId is empty!"); } - readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(),res); - readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(), res); + readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(), res); return response; } @@ -88,7 +92,7 @@ * @param response 结果集 * @param taskId 任务ID */ - public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId,List res) { + public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res) { File file = new File(fileName); if (!file.exists()) { log.info("{} file is empty!", fileName); @@ -108,7 +112,7 @@ List xyTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(xyTrains)) { if (CollectionUtil.isNotEmpty(xyTrains)) { - List list = StrUtil.split(xyTrains.get(xyTrains.size()-1), " "); + List list = StrUtil.split(xyTrains.get(xyTrains.size() - 1), " "); response.getPointNextDTO().setX(formatBigDecimal(list.get(0))); response.getPointNextDTO().setY(formatBigDecimal(list.get(1))); } @@ -117,10 +121,10 @@ case "z_train.txt": List zTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(zTrains)) { - String zTrain = zTrains.get(zTrains.size()-1); - response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); + String zTrain = zTrains.get(zTrains.size() - 1); + response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); } - break; + break; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java index ae9e520..fe543a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -3,7 +3,9 @@ import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Service; @@ -57,6 +59,24 @@ } @Override + public Integer readIsTask(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + return currId; + } + + @Override + public PointNextDTO readEstimateGrid(Long robotId) { + PointNextDTO curr = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId); + return curr; + } + + @Override + public PoseMessageResponseDTO readRobotPoint(Long robotId) { + PoseMessageResponseDTO point = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId); + return point; + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c6ecaaa..6925932 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -5,7 +5,6 @@ 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.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -19,10 +18,15 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.utils.PcdDownUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.Serializable; import java.util.List; @@ -42,6 +46,9 @@ private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + @Value("${casic.file.uploadPath}") + private String filePath; + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; @@ -69,6 +76,7 @@ wrapRobotInfo(robotInfo); return robotInfo; } + @Transactional @Override public void updateSpeed(RobotInfoSetDTO robotInfo) { @@ -90,9 +98,16 @@ } update.eq(RobotInfo::getId, robotInfo.getId()); update(update); + } - - + @Override + public void loadPcd(RobotInfo info) { + File file = new File(filePath + "finalCloud_" + info.getId() + ".pcd"); + try { + PcdDownUtil.downPcd(new FileOutputStream(file), info.getPcdDownload()); + } catch (IOException e) { + e.printStackTrace(); + } } @Transactional @@ -106,9 +121,7 @@ void wrapRobotInfo(RobotInfo robotInfo) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("robot_id", robotInfo.getId()); - List robotStatusInfos = robotStatusInfoService.list(wrapper); - if (CollectionUtil.isNotEmpty(robotStatusInfos)) { RobotStatusInfo robotStatusInfo = robotStatusInfos.get(0); robotInfo.setStatusInfo(robotStatusInfos.get(0)); 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 54c2c42..7e02ebc 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 @@ -10,6 +10,7 @@ import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; @@ -34,6 +35,7 @@ private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; 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 468fa88..f26904b 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 @@ -1,38 +1,48 @@ package com.casic.missiles.modular.robot.service.impl; +import cn.afterturn.easypoi.entity.ImageEntity; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +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; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; -import com.casic.missiles.modular.robot.model.RobotInfo; -import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.model.RouteInfo; -import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.*; +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.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import com.casic.missiles.modular.robot.service.*; +import com.casic.missiles.util.WordUtil; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** @@ -54,6 +64,11 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + @Value("${casic.file.uploadPath}") + private String uploadPath; + @Value("${casic.doc.temp}") + private String docTemp; + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; @@ -64,6 +79,33 @@ this.cacheService = cacheService; } + /** + * 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()); + } + + } + @Override public List selectTaskInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectTaskInfoPage(page, query); @@ -73,7 +115,9 @@ @Override public TaskInfo getById(Serializable id) { TaskInfo taskInfo = super.getById(id); - wrapTaskInfo(taskInfo); + if (taskInfo != null) { + wrapTaskInfo(taskInfo); + } return taskInfo; } @@ -91,6 +135,7 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); + taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); } @@ -108,29 +153,53 @@ private void openTask(StartTrackRequest request, String robotId) { QueryWrapper query = new QueryWrapper<>(); query.eq("target_id", request.getTrack_name()); - List routeInfos = routeInfoService.list(query); if (CollectionUtil.isEmpty(routeInfos)) { throw new ServiceException(500, "路线不存在,请及时更新"); } RouteInfo routeInfo = routeInfos.get(0); - + Integer isTask = 0; //开启寻源任务 if (request.getIsTask() == 1) { - //添加任务记录 - TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotId); - //No.3 更新器人执行任务信息 - Long currRouteId = routeInfo.getId(); - Long currTaskId = taskInfo.getId(); - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); - statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); - //算法初始化标志创建 - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); + isTask = 1; } + RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask); + //添加任务记录 + TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotInfo); + //No.3 更新器人执行任务信息 + Long currRouteId = routeInfo.getId(); + Long currTaskId = taskInfo.getId(); + + statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + //算法初始化标志创建 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId, routeInfo.getId()); } + private void closeTask(StartTrackRequest request, String robotId) { + //关闭操作 + RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); + if (statusInfo.getCurrTaskId() != null) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("update_time", new Date()); + updateWrapper.set("task_status", 1); + updateWrapper.set("end_time", new Date()); + updateWrapper.eq("id", statusInfo.getCurrTaskId()); + update(updateWrapper); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + } + + //清空任务缓存 + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + //清空当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + } + /** * 点位上传,执行循迹算法 * @@ -142,23 +211,32 @@ //判定任务是否已经完成初始化 Long longId = Convert.toLong(robotId); Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + //缓存当前点位信息 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId,dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; } + + //读取是否是循迹任务 + Integer isTask = cacheService.readIsTask(longId); + if (isTask != 1) { + log.info("循迹任务,不做处理"); + return; + } + Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); - //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { PathInitDTO pathInitDTO = createInitDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); //中子源计数率读取 - pathInitDTO.setCount(cacheService.getNeutronCount(longId)+""); + pathInitDTO.setCount(cacheService.getNeutronCount(longId) + ""); //执行1次算法 初始化操作 algorithmService.pathPlanningInit(pathInitDTO); } @@ -166,27 +244,149 @@ //No.2 任务执行中 if (taskId != null) { - //算法调用获取热力图 - PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); - //TO-DO 障碍物判定信息 - pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); - //中子源计数率读取 - pathPlanDTO.setCount(cacheService.getNeutronCount(longId)+""); - log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); - algorithmService.pathPlanning(pathPlanDTO); + //判断栅格变化 + GridPointDTO oldPointDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId); + if (oldPointDTO == null || isChange(pointDTO, oldPointDTO)) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO); + //算法调用获取热力图 + PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + //TO-DO 障碍物判定信息 + pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); + //中子源计数率读取 + pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); + log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); + AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - //是否触发寻源操作 - BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); - if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { - log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); - } - - if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { - log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //存储算法估算栅格信息 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); + //是否触发寻源操作 + BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); + if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { + log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); + } + if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { + log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + } } } } + @Override + public void saveImg(ImgDTO imgDTO) { + String path = saveHeatImg(imgDTO.getTaskId()); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + updateWrapper.set(TaskInfo::getHeatImg, path); + updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); + } + + @SneakyThrows + @Transactional + @Override + public void exportDoc(HttpServletResponse response, String taskId) { + TaskInfo info = getById(taskId); + response.setContentType("application/octet-stream"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=report.docx"); + Map params = new HashMap<>(); + //巡检报告_20230101(日期)_065930(时分秒) + String fileName = "巡检报告_" + DateUtil.format(info.getStartTime(), "yyyy-MM-dd") + DateUtil.format(info.getStartTime(), "HH:mm:ss"); + String taskNo = info.getTaskNo() + ""; + String deviceName = "中子源探测设备"; + String taskName = info.getTaskName(); + //固定巡检/自主巡检(默认为固定巡检,若中途切换了自主巡检则改为自主巡检) + String taskType = info.getTaskTypeName(); + //n(计数率高于告警阈值则切换自主巡检,开始告警,每走一步记录一次告警信息 + String alarmNum = info.getAlarmNum() + ""; + //开始时间 + String startTime = DateUtil.format(info.getStartTime(), "yyyy-MM-dd HH:mm:ss"); + String endTime = DateUtil.format(info.getEndTime(), "yyyy-MM-dd HH:mm:ss"); + + params.put("fileName", fileName); + params.put("taskNo", taskNo); + params.put("deviceName", deviceName); + params.put("taskName", taskName); + params.put("taskType", taskType); + params.put("alarmNum", alarmNum); + params.put("startTime", startTime); + params.put("endTime", endTime); + //读取 + List records = recordService.selectListByTaskId(info.getId(), info.getRobotId()); + Integer index = 1; + + if (CollectionUtil.isNotEmpty(records)) { + for (AlarmRecord record : records) { + //栅格信息转换 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + record.setX(pointDTO.getX()); + record.setY(pointDTO.getY()); + record.setIndex(index); + index++; + } + } + + params.put("records", records); + ImageEntity mcaImg = new ImageEntity(); + mcaImg.setHeight(600); + mcaImg.setWidth(600); + mcaImg.setUrl(uploadPath + info.getMcaImg()); + mcaImg.setData(WordUtil.getImageBase64(uploadPath + info.getMcaImg())); + params.put("mcaImg", mcaImg); + + ImageEntity routeImg = new ImageEntity(); + routeImg.setHeight(600); + routeImg.setWidth(600); + routeImg.setUrl(uploadPath + info.getRouteImg()); + routeImg.setData(WordUtil.getImageBase64(uploadPath + info.getRouteImg())); + params.put("routeImg", routeImg); + + ImageEntity heatImg = new ImageEntity(); + heatImg.setHeight(600); + heatImg.setWidth(600); + heatImg.setUrl(uploadPath + info.getHeatImg()); + heatImg.setData(WordUtil.getImageBase64(uploadPath + info.getHeatImg())); + params.put("heatImg", heatImg); + + ImageEntity psdImg = new ImageEntity(); + psdImg.setHeight(500); + psdImg.setWidth(500); + psdImg.setUrl(uploadPath + info.getPsdImg()); + psdImg.setData(WordUtil.getImageBase64(uploadPath + info.getPsdImg())); + params.put("psdImg", psdImg); + + WordUtil.exportOutputStream(docTemp, response.getOutputStream(), params); + } + + private String saveHeatImg(String taskId) { + String newFileName = "task\\" + taskId + ".png"; + //读取当前路径图片 + File file = new File("."); + File[] files = file.listFiles((dir, name) -> name.endsWith(".png") && name.startsWith("step")); + //判定当前执行路径最大step图片 + if (files != null && files.length > 0) { + FileUtil.copy(files[files.length - 1], new File(uploadPath + newFileName), true); + } else { + return ""; + } + return newFileName; + } + + /** + * 是否变化 + * + * @param pointDTO 点位DTO + * @param oldPointDTO 缓存dDTO + * @return + */ + private boolean isChange(GridPointDTO pointDTO, GridPointDTO oldPointDTO) { + if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) { + return false; + } + return true; + } + private PathPlanDTO createPlanDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { PathPlanDTO pathPlanDTO = new PathPlanDTO(); pathPlanDTO.setX(pointDTO.getX().intValue() + ""); @@ -209,7 +409,7 @@ return pathInitDTO; } - private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, String robotId) { + private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, RobotInfo robotInfo) { //No.2 新增任务信息 TaskInfo taskInfo = new TaskInfo(); String currDate = DateUtil.format(new Date(), "yyyyMMdd"); @@ -229,30 +429,13 @@ taskInfo.setTaskStatus(0); taskInfo.setStartTime(new Date()); taskInfo.setRouteId(routeInfo.getId()); - taskInfo.setRobotId(Convert.toLong(robotId)); + taskInfo.setRobotId(robotInfo.getId()); + taskInfo.setGridNumber(robotInfo.getGridNumber()); + taskInfo.setGridSize(robotInfo.getGridSize()); save(taskInfo); return taskInfo; } - private void closeTask(StartTrackRequest request, String robotId) { - //关闭操作 - RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); - if (statusInfo.getCurrTaskId() != null) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("update_time", new Date()); - updateWrapper.set("task_status", 1); - updateWrapper.set("end_time", new Date()); - updateWrapper.eq("id", statusInfo.getCurrTaskId()); - update(updateWrapper); - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); - } - //清空任务缓存 - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); - } - @Override public List getTaskListByStatus(Integer status, Integer taskType, Integer discernType) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -261,5 +444,4 @@ queryWrapper.eq(null != discernType, "discern_type", discernType); return this.list(queryWrapper); } - } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java index e296f3d..06c8bc0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java @@ -12,7 +12,6 @@ */ public class PcdDownUtil { public static void downPcd(HttpServletResponse response, String urlPath) throws IOException { - response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); OutputStream outputStream = null; @@ -44,4 +43,31 @@ } } + public static void downPcd(OutputStream outputStream, String urlPath) throws IOException { + InputStream inputStream = null; + try { + // 这里URLEncoder.encode可以防止中文乱码 当然和easyExcel没有关系 + URL url = new URL(urlPath); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.connect(); + inputStream = connection.getInputStream(); + //写流操作 + int bytesRead; + byte[] buffer = new byte[8192]; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + inputStream.close(); + } + if (outputStream != null) { + outputStream.close(); + } + } + + } } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/util/WordUtil.java b/casic-server/src/main/java/com/casic/missiles/util/WordUtil.java new file mode 100644 index 0000000..70c7be7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/util/WordUtil.java @@ -0,0 +1,136 @@ +package com.casic.missiles.util; + +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import java.io.*; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class WordUtil { + public void imageWordExport() { + Map map = new HashMap(); + map.put("department", "Easypoi"); + map.put("person", "JueYue"); + map.put("time", DateUtil.format(new Date(), "yyyy-MM-dd")); + ImageEntity image = new ImageEntity(); + image.setHeight(200); + image.setWidth(500); + image.setUrl("cn/afterturn/easypoi/test/word/img/testCode.png"); + image.setType(ImageEntity.URL); + map.put("testCode", image); + try { + XWPFDocument doc = WordExportUtil.exportWord07( + "cn/afterturn/easypoi/test/word/doc/Image.docx", map); + FileOutputStream fos = new FileOutputStream("D:/excel/image.docx"); + doc.write(fos); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 简单导出没有图片和Excel + */ + public static void SimpleWordExport() { + Map map = new HashMap(); + map.put("department", "Easypoi"); + map.put("person", "JueYue"); + map.put("time", DateUtil.format(new Date(), "yyyy-MM-dd")); + map.put("me", "JueYue"); + map.put("date", "2015-01-03"); + try { + + XWPFDocument doc = WordExportUtil.exportWord07("simple.docx", map); + FileOutputStream fos = new FileOutputStream("C:/excel/simple.docx"); + doc.write(fos); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) throws IOException { +// SimpleWordExport(); + String basePath = "D:\\workspace\\server\\keti\\casic-robot-inspection\\casic-web\\src\\main\\resources\\config\\path\\"; + String tempPath = basePath + "report.docx"; + Map params = new HashMap<>(); + params.put("x", "123"); + + ImageEntity image = new ImageEntity(); + image.setHeight(500); + image.setWidth(500); + image.setUrl(basePath + "routeImg.png"); + image.setData(getImageBase64(basePath + "2.png")); + + params.put("image", image); + exportWord(tempPath, basePath, "X.docx", params); + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + public static void exportOutputStream(String templatePath, OutputStream fos, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 0549422..7e5b423 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -127,6 +127,16 @@ jna 3.0.0 + + com.casic + casic-file + ${extension.version} + + + com.casic + casic-file-support + ${extension.version} + casic-robot-inspection diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index 2f8eba5..e03b965 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -29,4 +29,11 @@ * @param robotInfo 机器信息 */ void updateSpeed(RobotInfoSetDTO robotInfo); + + /** + * 加载机器人信息至本地 + * + * @param info + */ + void loadPcd(RobotInfo info); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index c491462..c41e16a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -48,5 +50,14 @@ * * @param dto 实体 */ - void pointCallBack(PoseMessageResponseDTO dto,String robotId); + void pointCallBack(PoseMessageResponseDTO dto, String robotId); + + /** + * 图片路径保存 + * + * @param imgDTO + */ + void saveImg(ImgDTO imgDTO); + + void exportDoc(HttpServletResponse response, String taskId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java index 3a22f77..1fc46bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java @@ -70,6 +70,13 @@ } @Override + public List selectListByTaskId(Long id, Long robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("task_id", id); + return list(query); + } + + @Override public boolean getAlarmByTask(Long taskId) { QueryWrapper query = new QueryWrapper<>(); query.eq("task_id", taskId); 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 dccb098..bb7c9d2 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 @@ -44,11 +44,11 @@ List commends = new ArrayList<>(); commends.add(initPath); commends.addAll(initDTO.toArray()); - List res= AlgorithmUtils.invokeJob(commends); + List res = AlgorithmUtils.invokeJob(commends); //判断当前任务是否开启 - AlgorithmResponse response = getAlgorithmResponse(initDTO,res); - if(response.getTaskHeatMap()!=null){ + AlgorithmResponse response = getAlgorithmResponse(initDTO, res); + if (response.getTaskHeatMap() != null) { heatMapService.saveOrUpdateByTaskId(response.getTaskHeatMap()); } return response; @@ -62,22 +62,26 @@ commends.add(planPath); commends.addAll(planDTO.toArray()); List res = AlgorithmUtils.invokeJob(commends); - AlgorithmResponse response = getAlgorithmResponse(planDTO,res); - // + AlgorithmResponse response = getAlgorithmResponse(planDTO, res); + //next 点位编写 + if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + } return response; } - private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO,List res) { + private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO, List res) { File repetitionFile = new File("repetition.txt"); AlgorithmResponse response = new AlgorithmResponse(); if (initDTO.getTaskId() != null && repetitionFile.exists()) { - readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(), res); } else { log.info("taskId is empty!"); } - readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(),res); - readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(), res); + readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(), res); return response; } @@ -88,7 +92,7 @@ * @param response 结果集 * @param taskId 任务ID */ - public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId,List res) { + public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res) { File file = new File(fileName); if (!file.exists()) { log.info("{} file is empty!", fileName); @@ -108,7 +112,7 @@ List xyTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(xyTrains)) { if (CollectionUtil.isNotEmpty(xyTrains)) { - List list = StrUtil.split(xyTrains.get(xyTrains.size()-1), " "); + List list = StrUtil.split(xyTrains.get(xyTrains.size() - 1), " "); response.getPointNextDTO().setX(formatBigDecimal(list.get(0))); response.getPointNextDTO().setY(formatBigDecimal(list.get(1))); } @@ -117,10 +121,10 @@ case "z_train.txt": List zTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(zTrains)) { - String zTrain = zTrains.get(zTrains.size()-1); - response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); + String zTrain = zTrains.get(zTrains.size() - 1); + response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); } - break; + break; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java index ae9e520..fe543a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -3,7 +3,9 @@ import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Service; @@ -57,6 +59,24 @@ } @Override + public Integer readIsTask(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + return currId; + } + + @Override + public PointNextDTO readEstimateGrid(Long robotId) { + PointNextDTO curr = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId); + return curr; + } + + @Override + public PoseMessageResponseDTO readRobotPoint(Long robotId) { + PoseMessageResponseDTO point = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId); + return point; + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c6ecaaa..6925932 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -5,7 +5,6 @@ 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.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -19,10 +18,15 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.utils.PcdDownUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.Serializable; import java.util.List; @@ -42,6 +46,9 @@ private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + @Value("${casic.file.uploadPath}") + private String filePath; + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; @@ -69,6 +76,7 @@ wrapRobotInfo(robotInfo); return robotInfo; } + @Transactional @Override public void updateSpeed(RobotInfoSetDTO robotInfo) { @@ -90,9 +98,16 @@ } update.eq(RobotInfo::getId, robotInfo.getId()); update(update); + } - - + @Override + public void loadPcd(RobotInfo info) { + File file = new File(filePath + "finalCloud_" + info.getId() + ".pcd"); + try { + PcdDownUtil.downPcd(new FileOutputStream(file), info.getPcdDownload()); + } catch (IOException e) { + e.printStackTrace(); + } } @Transactional @@ -106,9 +121,7 @@ void wrapRobotInfo(RobotInfo robotInfo) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("robot_id", robotInfo.getId()); - List robotStatusInfos = robotStatusInfoService.list(wrapper); - if (CollectionUtil.isNotEmpty(robotStatusInfos)) { RobotStatusInfo robotStatusInfo = robotStatusInfos.get(0); robotInfo.setStatusInfo(robotStatusInfos.get(0)); 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 54c2c42..7e02ebc 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 @@ -10,6 +10,7 @@ import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; @@ -34,6 +35,7 @@ private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; 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 468fa88..f26904b 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 @@ -1,38 +1,48 @@ package com.casic.missiles.modular.robot.service.impl; +import cn.afterturn.easypoi.entity.ImageEntity; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +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; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; -import com.casic.missiles.modular.robot.model.RobotInfo; -import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.model.RouteInfo; -import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.*; +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.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import com.casic.missiles.modular.robot.service.*; +import com.casic.missiles.util.WordUtil; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** @@ -54,6 +64,11 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + @Value("${casic.file.uploadPath}") + private String uploadPath; + @Value("${casic.doc.temp}") + private String docTemp; + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; @@ -64,6 +79,33 @@ this.cacheService = cacheService; } + /** + * 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()); + } + + } + @Override public List selectTaskInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectTaskInfoPage(page, query); @@ -73,7 +115,9 @@ @Override public TaskInfo getById(Serializable id) { TaskInfo taskInfo = super.getById(id); - wrapTaskInfo(taskInfo); + if (taskInfo != null) { + wrapTaskInfo(taskInfo); + } return taskInfo; } @@ -91,6 +135,7 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); + taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); } @@ -108,29 +153,53 @@ private void openTask(StartTrackRequest request, String robotId) { QueryWrapper query = new QueryWrapper<>(); query.eq("target_id", request.getTrack_name()); - List routeInfos = routeInfoService.list(query); if (CollectionUtil.isEmpty(routeInfos)) { throw new ServiceException(500, "路线不存在,请及时更新"); } RouteInfo routeInfo = routeInfos.get(0); - + Integer isTask = 0; //开启寻源任务 if (request.getIsTask() == 1) { - //添加任务记录 - TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotId); - //No.3 更新器人执行任务信息 - Long currRouteId = routeInfo.getId(); - Long currTaskId = taskInfo.getId(); - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); - statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); - //算法初始化标志创建 - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); + isTask = 1; } + RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask); + //添加任务记录 + TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotInfo); + //No.3 更新器人执行任务信息 + Long currRouteId = routeInfo.getId(); + Long currTaskId = taskInfo.getId(); + + statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + //算法初始化标志创建 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId, routeInfo.getId()); } + private void closeTask(StartTrackRequest request, String robotId) { + //关闭操作 + RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); + if (statusInfo.getCurrTaskId() != null) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("update_time", new Date()); + updateWrapper.set("task_status", 1); + updateWrapper.set("end_time", new Date()); + updateWrapper.eq("id", statusInfo.getCurrTaskId()); + update(updateWrapper); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + } + + //清空任务缓存 + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + //清空当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + } + /** * 点位上传,执行循迹算法 * @@ -142,23 +211,32 @@ //判定任务是否已经完成初始化 Long longId = Convert.toLong(robotId); Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + //缓存当前点位信息 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId,dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; } + + //读取是否是循迹任务 + Integer isTask = cacheService.readIsTask(longId); + if (isTask != 1) { + log.info("循迹任务,不做处理"); + return; + } + Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); - //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { PathInitDTO pathInitDTO = createInitDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); //中子源计数率读取 - pathInitDTO.setCount(cacheService.getNeutronCount(longId)+""); + pathInitDTO.setCount(cacheService.getNeutronCount(longId) + ""); //执行1次算法 初始化操作 algorithmService.pathPlanningInit(pathInitDTO); } @@ -166,27 +244,149 @@ //No.2 任务执行中 if (taskId != null) { - //算法调用获取热力图 - PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); - //TO-DO 障碍物判定信息 - pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); - //中子源计数率读取 - pathPlanDTO.setCount(cacheService.getNeutronCount(longId)+""); - log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); - algorithmService.pathPlanning(pathPlanDTO); + //判断栅格变化 + GridPointDTO oldPointDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId); + if (oldPointDTO == null || isChange(pointDTO, oldPointDTO)) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO); + //算法调用获取热力图 + PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + //TO-DO 障碍物判定信息 + pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); + //中子源计数率读取 + pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); + log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); + AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - //是否触发寻源操作 - BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); - if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { - log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); - } - - if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { - log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //存储算法估算栅格信息 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); + //是否触发寻源操作 + BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); + if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { + log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); + } + if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { + log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + } } } } + @Override + public void saveImg(ImgDTO imgDTO) { + String path = saveHeatImg(imgDTO.getTaskId()); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + updateWrapper.set(TaskInfo::getHeatImg, path); + updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); + } + + @SneakyThrows + @Transactional + @Override + public void exportDoc(HttpServletResponse response, String taskId) { + TaskInfo info = getById(taskId); + response.setContentType("application/octet-stream"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=report.docx"); + Map params = new HashMap<>(); + //巡检报告_20230101(日期)_065930(时分秒) + String fileName = "巡检报告_" + DateUtil.format(info.getStartTime(), "yyyy-MM-dd") + DateUtil.format(info.getStartTime(), "HH:mm:ss"); + String taskNo = info.getTaskNo() + ""; + String deviceName = "中子源探测设备"; + String taskName = info.getTaskName(); + //固定巡检/自主巡检(默认为固定巡检,若中途切换了自主巡检则改为自主巡检) + String taskType = info.getTaskTypeName(); + //n(计数率高于告警阈值则切换自主巡检,开始告警,每走一步记录一次告警信息 + String alarmNum = info.getAlarmNum() + ""; + //开始时间 + String startTime = DateUtil.format(info.getStartTime(), "yyyy-MM-dd HH:mm:ss"); + String endTime = DateUtil.format(info.getEndTime(), "yyyy-MM-dd HH:mm:ss"); + + params.put("fileName", fileName); + params.put("taskNo", taskNo); + params.put("deviceName", deviceName); + params.put("taskName", taskName); + params.put("taskType", taskType); + params.put("alarmNum", alarmNum); + params.put("startTime", startTime); + params.put("endTime", endTime); + //读取 + List records = recordService.selectListByTaskId(info.getId(), info.getRobotId()); + Integer index = 1; + + if (CollectionUtil.isNotEmpty(records)) { + for (AlarmRecord record : records) { + //栅格信息转换 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + record.setX(pointDTO.getX()); + record.setY(pointDTO.getY()); + record.setIndex(index); + index++; + } + } + + params.put("records", records); + ImageEntity mcaImg = new ImageEntity(); + mcaImg.setHeight(600); + mcaImg.setWidth(600); + mcaImg.setUrl(uploadPath + info.getMcaImg()); + mcaImg.setData(WordUtil.getImageBase64(uploadPath + info.getMcaImg())); + params.put("mcaImg", mcaImg); + + ImageEntity routeImg = new ImageEntity(); + routeImg.setHeight(600); + routeImg.setWidth(600); + routeImg.setUrl(uploadPath + info.getRouteImg()); + routeImg.setData(WordUtil.getImageBase64(uploadPath + info.getRouteImg())); + params.put("routeImg", routeImg); + + ImageEntity heatImg = new ImageEntity(); + heatImg.setHeight(600); + heatImg.setWidth(600); + heatImg.setUrl(uploadPath + info.getHeatImg()); + heatImg.setData(WordUtil.getImageBase64(uploadPath + info.getHeatImg())); + params.put("heatImg", heatImg); + + ImageEntity psdImg = new ImageEntity(); + psdImg.setHeight(500); + psdImg.setWidth(500); + psdImg.setUrl(uploadPath + info.getPsdImg()); + psdImg.setData(WordUtil.getImageBase64(uploadPath + info.getPsdImg())); + params.put("psdImg", psdImg); + + WordUtil.exportOutputStream(docTemp, response.getOutputStream(), params); + } + + private String saveHeatImg(String taskId) { + String newFileName = "task\\" + taskId + ".png"; + //读取当前路径图片 + File file = new File("."); + File[] files = file.listFiles((dir, name) -> name.endsWith(".png") && name.startsWith("step")); + //判定当前执行路径最大step图片 + if (files != null && files.length > 0) { + FileUtil.copy(files[files.length - 1], new File(uploadPath + newFileName), true); + } else { + return ""; + } + return newFileName; + } + + /** + * 是否变化 + * + * @param pointDTO 点位DTO + * @param oldPointDTO 缓存dDTO + * @return + */ + private boolean isChange(GridPointDTO pointDTO, GridPointDTO oldPointDTO) { + if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) { + return false; + } + return true; + } + private PathPlanDTO createPlanDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { PathPlanDTO pathPlanDTO = new PathPlanDTO(); pathPlanDTO.setX(pointDTO.getX().intValue() + ""); @@ -209,7 +409,7 @@ return pathInitDTO; } - private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, String robotId) { + private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, RobotInfo robotInfo) { //No.2 新增任务信息 TaskInfo taskInfo = new TaskInfo(); String currDate = DateUtil.format(new Date(), "yyyyMMdd"); @@ -229,30 +429,13 @@ taskInfo.setTaskStatus(0); taskInfo.setStartTime(new Date()); taskInfo.setRouteId(routeInfo.getId()); - taskInfo.setRobotId(Convert.toLong(robotId)); + taskInfo.setRobotId(robotInfo.getId()); + taskInfo.setGridNumber(robotInfo.getGridNumber()); + taskInfo.setGridSize(robotInfo.getGridSize()); save(taskInfo); return taskInfo; } - private void closeTask(StartTrackRequest request, String robotId) { - //关闭操作 - RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); - if (statusInfo.getCurrTaskId() != null) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("update_time", new Date()); - updateWrapper.set("task_status", 1); - updateWrapper.set("end_time", new Date()); - updateWrapper.eq("id", statusInfo.getCurrTaskId()); - update(updateWrapper); - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); - } - //清空任务缓存 - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); - } - @Override public List getTaskListByStatus(Integer status, Integer taskType, Integer discernType) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -261,5 +444,4 @@ queryWrapper.eq(null != discernType, "discern_type", discernType); return this.list(queryWrapper); } - } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java index e296f3d..06c8bc0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java @@ -12,7 +12,6 @@ */ public class PcdDownUtil { public static void downPcd(HttpServletResponse response, String urlPath) throws IOException { - response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); OutputStream outputStream = null; @@ -44,4 +43,31 @@ } } + public static void downPcd(OutputStream outputStream, String urlPath) throws IOException { + InputStream inputStream = null; + try { + // 这里URLEncoder.encode可以防止中文乱码 当然和easyExcel没有关系 + URL url = new URL(urlPath); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.connect(); + inputStream = connection.getInputStream(); + //写流操作 + int bytesRead; + byte[] buffer = new byte[8192]; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + inputStream.close(); + } + if (outputStream != null) { + outputStream.close(); + } + } + + } } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/util/WordUtil.java b/casic-server/src/main/java/com/casic/missiles/util/WordUtil.java new file mode 100644 index 0000000..70c7be7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/util/WordUtil.java @@ -0,0 +1,136 @@ +package com.casic.missiles.util; + +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import java.io.*; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class WordUtil { + public void imageWordExport() { + Map map = new HashMap(); + map.put("department", "Easypoi"); + map.put("person", "JueYue"); + map.put("time", DateUtil.format(new Date(), "yyyy-MM-dd")); + ImageEntity image = new ImageEntity(); + image.setHeight(200); + image.setWidth(500); + image.setUrl("cn/afterturn/easypoi/test/word/img/testCode.png"); + image.setType(ImageEntity.URL); + map.put("testCode", image); + try { + XWPFDocument doc = WordExportUtil.exportWord07( + "cn/afterturn/easypoi/test/word/doc/Image.docx", map); + FileOutputStream fos = new FileOutputStream("D:/excel/image.docx"); + doc.write(fos); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 简单导出没有图片和Excel + */ + public static void SimpleWordExport() { + Map map = new HashMap(); + map.put("department", "Easypoi"); + map.put("person", "JueYue"); + map.put("time", DateUtil.format(new Date(), "yyyy-MM-dd")); + map.put("me", "JueYue"); + map.put("date", "2015-01-03"); + try { + + XWPFDocument doc = WordExportUtil.exportWord07("simple.docx", map); + FileOutputStream fos = new FileOutputStream("C:/excel/simple.docx"); + doc.write(fos); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) throws IOException { +// SimpleWordExport(); + String basePath = "D:\\workspace\\server\\keti\\casic-robot-inspection\\casic-web\\src\\main\\resources\\config\\path\\"; + String tempPath = basePath + "report.docx"; + Map params = new HashMap<>(); + params.put("x", "123"); + + ImageEntity image = new ImageEntity(); + image.setHeight(500); + image.setWidth(500); + image.setUrl(basePath + "routeImg.png"); + image.setData(getImageBase64(basePath + "2.png")); + + params.put("image", image); + exportWord(tempPath, basePath, "X.docx", params); + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + public static void exportOutputStream(String templatePath, OutputStream fos, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 0549422..7e5b423 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -127,6 +127,16 @@ jna 3.0.0 + + com.casic + casic-file + ${extension.version} + + + com.casic + casic-file-support + ${extension.version} + casic-robot-inspection diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index 7d4b29f..9a89795 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -9,6 +9,9 @@ max-file-size: 50MB max-request-size: 80MB # MQTT集成 10.11.1.2 url: tcp://10.11.1.3:1883 tcp://192.168.1.126:1883 + web: + resources: + static-locations: file:C:\casic\tmp\ mqtt: username: admin password: password @@ -42,9 +45,13 @@ algorithm: initPath: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\path\PathPlanning_init.exe planPath: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\path\PathPlanning.exe + doc: + temp: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\path\report.docx config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + file: + uploadPath: C:\casic\tmp\ server: servlet: context-path: /casic-robot \ No newline at end of file diff --git a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java index b2d7c76..c24e363 100644 --- a/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java +++ b/casic-ptz/src/main/java/com/casic/missiles/modular/ptz/controller/PtzNetController.java @@ -59,12 +59,13 @@ return ResponseDataDTO.error("预览失败"); } } - @ApiOperation(value = "设备复位",hidden = true) + + @ApiOperation(value = "设备复位", hidden = true) @RequestMapping("/setPreset") @ResponseBody public Object setPreset(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, String command) { - Long userId = getUserIdByIp(robotId,deviceIp); + Long userId = getUserIdByIp(robotId, deviceIp); if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } @@ -72,6 +73,7 @@ return ResponseData.success(); } + /** * 根据设备ip获取登录id(服务端id) * @@ -111,6 +113,9 @@ if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } + if (speed == null) { + speed = 1; + } if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { @@ -133,10 +138,14 @@ public Object controlWithSpeedTest(@ApiParam("机器人ID") String robotId, @ApiParam("设备IP") String deviceIp, @ApiParam("控制指令类型(up-上,down-下,left-左,right-右)") String command, @ApiParam("0-开始, 1-结束") Integer isStop, Integer speed) { logger.info("request controlWithSpeedTest"); Long userId = getUserIdByIp(robotId, deviceIp); + if (ObjectUtil.isEmpty(userId) || userId < 0) { return ResponseData.error("设备注册失败"); } - if (ihcNetService.controlWithSpeedTest(userId.intValue(), command, isStop, speed)) { + if (speed == null) { + speed = 1; + } + if (ihcNetService.controlWithSpeed(userId.intValue(), command, isStop, speed)) { return ResponseData.success(); } else { return ResponseData.error("控制失败"); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index e1a78b5..546fe74 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -80,6 +80,22 @@ 0.5.8 + + + cn.afterturn + easypoi-base + 4.4.0 + + + cn.afterturn + easypoi-web + 4.4.0 + + + cn.afterturn + easypoi-annotation + 4.4.0 + diff --git a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java index 51e63a5..d580b94 100644 --- a/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/common/WebSocket.java @@ -1,5 +1,6 @@ package com.casic.missiles.common; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -94,6 +95,7 @@ Session session = sessionPool.get(userId); if (session != null) { try { +// session.getAsyncRemote().sendObject(JSON.parseObject(message)); session.getAsyncRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); @@ -101,4 +103,22 @@ } } + /** + * 单点消息 + * + * @param userId 用户信息 + * @param obj 消息体 + */ + public void sendOneObjMessage(String userId, Object obj) { + log.info("【websocket消息】单点消息:" + obj); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendObject(obj); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } \ 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 48abc0c..aa51120 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 @@ -19,11 +19,12 @@ /** * 当前路线ID */ - String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + String KEY_CUR_ROUTE_ID = "CUR_ROUTE_ID_"; /** - * 当前任务ID + * 是否是任务 1 是 */ + String KEY_IS_TASK = "CUR_IS_TASK_"; String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; @@ -31,4 +32,13 @@ * PSD数据ID */ String KEY_PSD_DATA_ID= "PSD_DATA_ID_"; + /** + * 当前栅格点位信息 + */ + String KEY_CUR_POINT = "KEY_CUR_POINT_"; + /** + * 当前坐标信息缓存 + */ + String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; + String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; } 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 f74aee2..c34cd78 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 @@ -43,27 +43,27 @@ } @ApiOperation(value = "启动/关闭录包" , notes = "返回 1成功 0失败") - @GetMapping(value = "/dataRecord") + @PostMapping(value = "/dataRecord") public ResponseDataDTO dataRecord(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.DATA_RECORD); } @ApiOperation(value = "启动/关闭建图" , notes = "返回 1成功 0失败,建图进度请求状态接口") - @GetMapping(value = "/slam") + @PostMapping(value = "/slam") public ResponseDataDTO slam(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SLAM); } @ApiOperation(value = "转栅格地图" , notes = "返回 1成功 0失败") - @GetMapping(value = "/changePcd") + @PostMapping(value = "/changePcd") public ResponseDataDTO changePcd(@RequestBody DataRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.CHANGE_PCD); } @SneakyThrows @ApiOperation(value = "PCD下载接口") - @GetMapping(value = "/pcdDownload") + @PostMapping(value = "/pcdDownload") public void pcdDownload(HttpServletResponse response, @ApiParam("机器人ID") String robotId) { RobotInfo info = robotInfoService.getById(robotId); PcdDownUtil.downPcd(response, info.getPcdDownload()); @@ -76,18 +76,18 @@ return ResponseDataDTO.success(); } @ApiOperation(value = "软件急停") - @GetMapping(value = "/softwareStop") + @PostMapping(value = "/softwareStop") public ResponseDataDTO softwareStop(@RequestBody SoftwareStopRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); } @ApiOperation(value = "循迹列表读取") - @GetMapping(value = "/trackList") + @PostMapping(value = "/trackList") public ResponseDataDTO> trackList(@RequestBody TrackListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_LIST); } @ApiOperation(value = "路线关键点读取") - @GetMapping(value = "/taskPointList") + @PostMapping(value = "/taskPointList") public ResponseDataDTO> taskPointList(@RequestBody TrackPointListRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); } @@ -99,7 +99,7 @@ * @return */ @ApiOperation(value = "启动或关闭轨迹录制功能" , notes = "返回 1成功 0失败") - @GetMapping(value = "/trackRecord") + @PostMapping(value = "/trackRecord") public ResponseDataDTO trackRecord(@RequestBody TrackRecordRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.TRACK_RECORD); } @@ -111,7 +111,7 @@ * @return */ @ApiOperation(value = "启动或关闭循迹功能" , notes = "返回 1成功 0失败 wait 启动时是否等待,0代表循迹启动即运动,不等待;1代表循迹启动原地等待。若无此字段,默认循迹启动不等待直接运动") - @GetMapping(value = "/startTrack") + @PostMapping(value = "/startTrack") public ResponseDataDTO startTrack(@RequestBody StartTrackRequest request) { return baseRobotService.execCmdHandler(request, InstructCodeEnums.START_TRACK); } @@ -123,7 +123,7 @@ * @return */ @ApiOperation(value = "导航开启/关闭接口" , notes = "返回 1成功 0失败") - @GetMapping(value = "/ctrlNav") + @PostMapping(value = "/ctrlNav") public ResponseDataDTO ctrlNav(@RequestBody CrlNavRequest request) { if (StrUtil.isEmpty(request.getSn())) { request.setSn(request.getRobotId() + ""); @@ -136,7 +136,7 @@ } @ApiOperation(value = "启动/取消暂停" , notes = "返回 1成功 0失败") - @GetMapping(value = "/navPause") + @PostMapping(value = "/navPause") public ResponseDataDTO navPause(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -146,14 +146,14 @@ } @ApiOperation(value = "速度控制与反馈" , notes = "超过0.5s停发会主动停止 返回 1成功 0失败") - @GetMapping(value = "/appCmdVel") + @PostMapping(value = "/appCmdVel") public ResponseDataDTO appCmdVel(@RequestBody AppCmdVelRequest request) { ResponseDataDTO dto = baseRobotService.appCmdVel(request); return dto; } @ApiOperation(value = "启动/取消停障" , notes = "返回 1成功 0失败") - @GetMapping(value = "/stopNavStop") + @PostMapping(value = "/stopNavStop") public ResponseDataDTO stopNavStop(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -163,7 +163,7 @@ } @ApiOperation(value = "查询机器人最大运动速度功能(导航和停障)" , notes = "机器人返回当前设置最大速度参数给客户端,如果机器人不运动则无返回,如果未设置最大运动速度则返回当前运动速度") - @GetMapping(value = "/getCurrentSpeed") + @PostMapping(value = "/getCurrentSpeed") public ResponseDataDTO getCurrentSpeed(@RequestBody CrlNavRequest request) { MessageRequestDTO messageDTO = new MessageRequestDTO(); RobotInfo info = robotInfoService.getById(request.getRobotId()); @@ -179,7 +179,7 @@ * @return */ @ApiOperation(value = "实时状态读取接口" , notes = "get_navigation:获取当前导航状态 get_data_record:获取录包状态 get_track_record:获取轨迹录制状态,get_track:获取循迹状态 get_ins:获取ins状态 返回 0未开启 1开启 2 错误") - @GetMapping(value = "/{cmdType}") + @PostMapping(value = "/{cmdType}") public ResponseDataDTO commCmd(@PathVariable String cmdType, @RequestBody CrlNavRequest request) { if (!InstructCodeEnums.commCmdMap.containsKey(cmdType)) { return new ResponseDataDTO<>(false, 500, "指令不存在" , 0); 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 2534991..d7ef09d 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 @@ -9,6 +9,7 @@ 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.model.RouteInfo; @@ -18,8 +19,10 @@ 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.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.List; @@ -36,6 +39,7 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; @@ -50,6 +54,7 @@ QueryWrapper query = taskInfoVO.genQuery(); return ResponseDataDTO.success(taskInfoService.list(query)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -59,6 +64,7 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @@ -68,15 +74,25 @@ Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanning(pathPlanDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); - return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO, 10, new BigDecimal(4))); } + + @ApiOperation("图片路径保存") + @GetMapping(value = "/saveImg") + public ResponseDataDTO> saveImg(ImgDTO imgDTO) { + Page page = PageFactory.defaultPage(); + taskInfoService.saveImg(imgDTO); + return ResponseDataDTO.success(super.packForBT(page)); + } + /** * 任务管理(其他信息待定)分页列表 */ @@ -131,10 +147,9 @@ /** * 导出巡检报告 */ - @ApiOperation(value = "导出接口-模板待定TO-DO") + @ApiOperation(value = "导出接口") @GetMapping(value = "/export") - public ResponseDataDTO export(@RequestBody List ids) { - taskInfoService.removeByIds(ids); - return ResponseDataDTO.success(); + public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { + taskInfoService.exportDoc(response,taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java new file mode 100644 index 0000000..c9bd184 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/ImgDTO.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.robot.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ImgDTO { + @ApiModelProperty(value = "mca图片路径") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径", hidden = true) + private String heatImg; + @ApiModelProperty(value = "任务ID") + private String taskId; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java index a29734d..f0413d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/PointNextDTO.java @@ -2,10 +2,11 @@ import lombok.Data; +import java.io.Serializable; import java.util.List; @Data -public class PointNextDTO { +public class PointNextDTO implements Serializable { private String x; private String y; private String z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java index 976e419..a2dfdcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/AlarmRecord.java @@ -131,6 +131,10 @@ @TableField(exist = false) private String discernTypeName; + @ApiModelProperty(value = "序号", dataType = "Integer") + @TableField(exist = false) + private Integer index; + @Override public String toString() { return "AlarmRecord{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java index 4f5053c..7da2fa0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/TaskInfo.java @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.Date; /** @@ -127,6 +128,25 @@ @TableField(exist = false) private TaskHeatMap heatMap; + @ApiModelProperty(value = "mca图片路径") + @TableField("mca_img") + private String mcaImg; + @ApiModelProperty(value = "psd图路径") + @TableField("psd_img") + private String psdImg; + @ApiModelProperty(value = "route图片路径") + @TableField("route_img") + private String routeImg; + @ApiModelProperty(value = "热力分布图路径") + @TableField("heat_img") + private String heatImg; + + @ApiModelProperty(value = "栅格顶点值", dataType = "Integer") + @TableField("grid_size") + private BigDecimal gridSize; + @ApiModelProperty(value = "栅格数量", dataType = "Integer") + @TableField("grid_number") + private Integer gridNumber; @Override public String toString() { return "TaskInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java index 5aaf056..5d687e4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/enums/InstructStatusMsgEnums.java @@ -18,7 +18,13 @@ * * @see com.casic.missiles.modular.robot.opt.handler.msg.SensorStatusMsgHandler */ - ROBOT_STATUS("robot_status" , "机器人状态消息"); + ROBOT_STATUS("robot_status" , "机器人状态消息"), + /** + * 热力图数据推送 + * + * @see com.casic.missiles.modular.robot.service.impl.TaskInfoServiceImpl + */ + HEAT_MAP("heat_map" , "机器人状态消息"); /** * 请求地址 */ 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 98b58b6..156fbcc 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.opt.handler; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.common.WebSocket; @@ -32,6 +33,15 @@ protected void sendWebSocket(InstructStatusMsgEnums enums, String robotId, MqttMessage message) { try { String json = new String(message.getPayload()); + if (StrUtil.isNotEmpty(json)) { + if (json.startsWith("\"")) { + json = json.substring(1); + } + if (json.endsWith("\"")) { + json = json.substring(0, json.length() - 1); + } + json = json.replaceAll("\\\\", ""); + } JSONObject jsonObject = JSON.parseObject(json); if (jsonObject.containsKey("msg")) { WsMsgBaseDTO wsMsgBaseDTO = new WsMsgBaseDTO(); 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 11735d6..70f02a3 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 @@ -27,6 +27,6 @@ public void process(String robotId, String topic, MqttMessage message) { log.info("----------------------电压信息反馈:{}", message); statusInfoService.saveVoltageResponseMessage(robotId, message); -// sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); + sendWebSocket(InstructStatusMsgEnums.PROCESS_MESSAGE, robotId, message); } } 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 2cc7e3f..51192fd 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 @@ -85,6 +85,8 @@ // 订阅默认消息,消息处理器统一处理 client.subscribe(topics); } + //机器人pcd读取 + robotInfoService.loadPcd(info); } catch (Exception e) { log.error("机器人信息初始化读取失败" , e); } @@ -104,7 +106,6 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); messageDTO.setMsg(request); ResponseDataDTO responseDataDTO = robotRouteOptService.robotCmd(info, InstructCodeEnums.APP_CMD_VEL, messageDTO); - return responseDataDTO; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java index ef8b479..ee40333 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/instruct/dto/PoseMessageResponseDTO.java @@ -1,14 +1,16 @@ package com.casic.missiles.modular.robot.opt.instruct.dto; +import com.fasterxml.jackson.core.SerializableString; import lombok.Data; +import java.io.Serializable; import java.math.BigDecimal; /** * 实时点位上报 {"msg": {"y": -20.73847741021961, "x": -1.958316040901666, "z": 0.4921659690312511, "theta": -2.494841778370823}} */ @Data -public class PoseMessageResponseDTO { +public class PoseMessageResponseDTO implements Serializable { private BigDecimal x; private BigDecimal y; private BigDecimal z; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java index 95e912c..a75aa8f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlarmRecordService.java @@ -30,7 +30,7 @@ * @return */ Integer selectCountByTaskId(Long id,Long robotId); - + List selectListByTaskId(Long id,Long robotId); /** * 根据任务id查询是否已经产生中子源告警 * @param taskId diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java index 1385b60..73982ee 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; /** * 机器人缓存服务 @@ -24,6 +26,7 @@ /** * 算法初始化状态读取 + * * @param robotId 机器人ID * @return 机器人状态 */ @@ -40,17 +43,43 @@ /** * 更新机器人任务初始化完成标志 + * * @param robotId 机器人id - * @param val 值 + * @param val 值 * @return */ - boolean updateTaskInit(Long robotId,Integer val); + boolean updateTaskInit(Long robotId, Integer val); RobotInfo getRobotInfo(Long robotId); /** * 当前检测器计数率 + * * @return */ Integer getNeutronCount(Long robotId); -} + + /** + * 任务启动标识 + * + * @param robotId 机器id + * @return + */ + Integer readIsTask(Long robotId); + + /** + * 算法估算栅格信息 + * + * @param robotId 机器ID + * @return + */ + PointNextDTO readEstimateGrid(Long robotId); + + /** + * 机器人当前点位信息缓存 + * + * @param robotId 机器ID + * @return + */ + PoseMessageResponseDTO readRobotPoint(Long robotId); +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java index 2f8eba5..e03b965 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotInfoService.java @@ -29,4 +29,11 @@ * @param robotInfo 机器信息 */ void updateSpeed(RobotInfoSetDTO robotInfo); + + /** + * 加载机器人信息至本地 + * + * @param info + */ + void loadPcd(RobotInfo info); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index c491462..c41e16a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.missiles.modular.robot.dto.ImgDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -48,5 +50,14 @@ * * @param dto 实体 */ - void pointCallBack(PoseMessageResponseDTO dto,String robotId); + void pointCallBack(PoseMessageResponseDTO dto, String robotId); + + /** + * 图片路径保存 + * + * @param imgDTO + */ + void saveImg(ImgDTO imgDTO); + + void exportDoc(HttpServletResponse response, String taskId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java index 3a22f77..1fc46bb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/AlarmRecordServiceImpl.java @@ -70,6 +70,13 @@ } @Override + public List selectListByTaskId(Long id, Long robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("task_id", id); + return list(query); + } + + @Override public boolean getAlarmByTask(Long taskId) { QueryWrapper query = new QueryWrapper<>(); query.eq("task_id", taskId); 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 dccb098..bb7c9d2 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 @@ -44,11 +44,11 @@ List commends = new ArrayList<>(); commends.add(initPath); commends.addAll(initDTO.toArray()); - List res= AlgorithmUtils.invokeJob(commends); + List res = AlgorithmUtils.invokeJob(commends); //判断当前任务是否开启 - AlgorithmResponse response = getAlgorithmResponse(initDTO,res); - if(response.getTaskHeatMap()!=null){ + AlgorithmResponse response = getAlgorithmResponse(initDTO, res); + if (response.getTaskHeatMap() != null) { heatMapService.saveOrUpdateByTaskId(response.getTaskHeatMap()); } return response; @@ -62,22 +62,26 @@ commends.add(planPath); commends.addAll(planDTO.toArray()); List res = AlgorithmUtils.invokeJob(commends); - AlgorithmResponse response = getAlgorithmResponse(planDTO,res); - // + AlgorithmResponse response = getAlgorithmResponse(planDTO, res); + //next 点位编写 + if(CollectionUtil.isNotEmpty(res)&&res.size()==2){ + response.getPointNextDTO().setX(formatBigDecimal(res.get(0).replaceAll("next_X: ",""))); + response.getPointNextDTO().setY(formatBigDecimal(res.get(1).replaceAll("next_Y: ",""))); + } return response; } - private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO,List res) { + private AlgorithmResponse getAlgorithmResponse(PathInitDTO initDTO, List res) { File repetitionFile = new File("repetition.txt"); AlgorithmResponse response = new AlgorithmResponse(); if (initDTO.getTaskId() != null && repetitionFile.exists()) { - readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("repetition.txt", response, initDTO.getTaskId(), res); } else { log.info("taskId is empty!"); } - readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(),res); - readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(),res); + readAlgorithmResponse("xy_train.txt", response, initDTO.getTaskId(), res); + readAlgorithmResponse("z_train.txt", response, initDTO.getTaskId(), res); return response; } @@ -88,7 +92,7 @@ * @param response 结果集 * @param taskId 任务ID */ - public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId,List res) { + public void readAlgorithmResponse(String fileName, AlgorithmResponse response, Long taskId, List res) { File file = new File(fileName); if (!file.exists()) { log.info("{} file is empty!", fileName); @@ -108,7 +112,7 @@ List xyTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(xyTrains)) { if (CollectionUtil.isNotEmpty(xyTrains)) { - List list = StrUtil.split(xyTrains.get(xyTrains.size()-1), " "); + List list = StrUtil.split(xyTrains.get(xyTrains.size() - 1), " "); response.getPointNextDTO().setX(formatBigDecimal(list.get(0))); response.getPointNextDTO().setY(formatBigDecimal(list.get(1))); } @@ -117,10 +121,10 @@ case "z_train.txt": List zTrains = FileUtil.readLines(file, CharsetUtil.CHARSET_UTF_8); if (CollectionUtil.isNotEmpty(zTrains)) { - String zTrain = zTrains.get(zTrains.size()-1); - response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); + String zTrain = zTrains.get(zTrains.size() - 1); + response.getPointNextDTO().setZ(formatBigDecimal(zTrain)); } - break; + break; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java index ae9e520..fe543a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -3,7 +3,9 @@ import cn.hutool.core.util.RandomUtil; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.PointNextDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotInfoService; import org.springframework.stereotype.Service; @@ -57,6 +59,24 @@ } @Override + public Integer readIsTask(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + return currId; + } + + @Override + public PointNextDTO readEstimateGrid(Long robotId) { + PointNextDTO curr = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId); + return curr; + } + + @Override + public PoseMessageResponseDTO readRobotPoint(Long robotId) { + PoseMessageResponseDTO point = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId); + return point; + } + + @Override public Long readTaskId(Long robotId) { Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); return currId; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java index c6ecaaa..6925932 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotInfoServiceImpl.java @@ -5,7 +5,6 @@ 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.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -19,10 +18,15 @@ import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; +import com.casic.missiles.modular.robot.utils.PcdDownUtil; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.Serializable; import java.util.List; @@ -42,6 +46,9 @@ private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + @Value("${casic.file.uploadPath}") + private String filePath; + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; @@ -69,6 +76,7 @@ wrapRobotInfo(robotInfo); return robotInfo; } + @Transactional @Override public void updateSpeed(RobotInfoSetDTO robotInfo) { @@ -90,9 +98,16 @@ } update.eq(RobotInfo::getId, robotInfo.getId()); update(update); + } - - + @Override + public void loadPcd(RobotInfo info) { + File file = new File(filePath + "finalCloud_" + info.getId() + ".pcd"); + try { + PcdDownUtil.downPcd(new FileOutputStream(file), info.getPcdDownload()); + } catch (IOException e) { + e.printStackTrace(); + } } @Transactional @@ -106,9 +121,7 @@ void wrapRobotInfo(RobotInfo robotInfo) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("robot_id", robotInfo.getId()); - List robotStatusInfos = robotStatusInfoService.list(wrapper); - if (CollectionUtil.isNotEmpty(robotStatusInfos)) { RobotStatusInfo robotStatusInfo = robotStatusInfos.get(0); robotInfo.setStatusInfo(robotStatusInfos.get(0)); 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 54c2c42..7e02ebc 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 @@ -10,6 +10,7 @@ import com.casic.missiles.modular.robot.model.RobotTrajectoryInfo; import com.casic.missiles.modular.robot.opt.instruct.base.dto.RobotResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; +import com.casic.missiles.modular.robot.service.IRobotCacheService; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; @@ -34,6 +35,7 @@ private final IRobotStatusInfoService robotStatusInfoService; private final ITaskInfoService infoService; + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { this.robotStatusInfoService = robotStatusInfoService; this.infoService = infoService; 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 468fa88..f26904b 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 @@ -1,38 +1,48 @@ package com.casic.missiles.modular.robot.service.impl; +import cn.afterturn.easypoi.entity.ImageEntity; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +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; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.common.WebSocket; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; -import com.casic.missiles.modular.robot.dto.GridPointDTO; -import com.casic.missiles.modular.robot.dto.PathInitDTO; -import com.casic.missiles.modular.robot.dto.PathPlanDTO; -import com.casic.missiles.modular.robot.model.RobotInfo; -import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.model.RouteInfo; -import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.*; +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.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import com.casic.missiles.modular.robot.service.*; +import com.casic.missiles.util.WordUtil; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** @@ -54,6 +64,11 @@ private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + @Value("${casic.file.uploadPath}") + private String uploadPath; + @Value("${casic.doc.temp}") + private String docTemp; + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; @@ -64,6 +79,33 @@ this.cacheService = cacheService; } + /** + * 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()); + } + + } + @Override public List selectTaskInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectTaskInfoPage(page, query); @@ -73,7 +115,9 @@ @Override public TaskInfo getById(Serializable id) { TaskInfo taskInfo = super.getById(id); - wrapTaskInfo(taskInfo); + if (taskInfo != null) { + wrapTaskInfo(taskInfo); + } return taskInfo; } @@ -91,6 +135,7 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); + taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); } @@ -108,29 +153,53 @@ private void openTask(StartTrackRequest request, String robotId) { QueryWrapper query = new QueryWrapper<>(); query.eq("target_id", request.getTrack_name()); - List routeInfos = routeInfoService.list(query); if (CollectionUtil.isEmpty(routeInfos)) { throw new ServiceException(500, "路线不存在,请及时更新"); } RouteInfo routeInfo = routeInfos.get(0); - + Integer isTask = 0; //开启寻源任务 if (request.getIsTask() == 1) { - //添加任务记录 - TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotId); - //No.3 更新器人执行任务信息 - Long currRouteId = routeInfo.getId(); - Long currTaskId = taskInfo.getId(); - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); - statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); - //算法初始化标志创建 - CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); + isTask = 1; } + RobotInfo robotInfo = cacheService.getRobotInfo(Convert.toLong(robotId)); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId, isTask); + //添加任务记录 + TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotInfo); + //No.3 更新器人执行任务信息 + Long currRouteId = routeInfo.getId(); + Long currTaskId = taskInfo.getId(); + + statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + //算法初始化标志创建 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId, routeInfo.getId()); } + private void closeTask(StartTrackRequest request, String robotId) { + //关闭操作 + RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); + if (statusInfo.getCurrTaskId() != null) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("update_time", new Date()); + updateWrapper.set("task_status", 1); + updateWrapper.set("end_time", new Date()); + updateWrapper.eq("id", statusInfo.getCurrTaskId()); + update(updateWrapper); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + } + + //清空任务缓存 + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_IS_TASK + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + //清空当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + } + /** * 点位上传,执行循迹算法 * @@ -142,23 +211,32 @@ //判定任务是否已经完成初始化 Long longId = Convert.toLong(robotId); Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + //缓存当前点位信息 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_XY_POINT + robotId,dto); RobotInfo robotInfo = cacheService.getRobotInfo(longId); if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { log.error("no config 中子源阈值未配置"); return; } + + //读取是否是循迹任务 + Integer isTask = cacheService.readIsTask(longId); + if (isTask != 1) { + log.info("循迹任务,不做处理"); + return; + } + Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); - //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 if (cacheService.updateTaskInit(longId, 1)) { PathInitDTO pathInitDTO = createInitDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); //中子源计数率读取 - pathInitDTO.setCount(cacheService.getNeutronCount(longId)+""); + pathInitDTO.setCount(cacheService.getNeutronCount(longId) + ""); //执行1次算法 初始化操作 algorithmService.pathPlanningInit(pathInitDTO); } @@ -166,27 +244,149 @@ //No.2 任务执行中 if (taskId != null) { - //算法调用获取热力图 - PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); - //TO-DO 障碍物判定信息 - pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); - //中子源计数率读取 - pathPlanDTO.setCount(cacheService.getNeutronCount(longId)+""); - log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); - algorithmService.pathPlanning(pathPlanDTO); + //判断栅格变化 + GridPointDTO oldPointDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId); + if (oldPointDTO == null || isChange(pointDTO, oldPointDTO)) { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_POINT + robotId, pointDTO); + //算法调用获取热力图 + PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + //TO-DO 障碍物判定信息 + pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); + //中子源计数率读取 + pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); + log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); + AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - //是否触发寻源操作 - BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); - if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { - log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); - } - - if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { - log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //存储算法估算栅格信息 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ESTIMATE_GRID + robotId, response.getPointNextDTO()); + //是否触发寻源操作 + BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); + if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { + log.debug("task planning-- robotId:{},taskId:{}", robotId, taskId); + } + if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { + log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + } } } } + @Override + public void saveImg(ImgDTO imgDTO) { + String path = saveHeatImg(imgDTO.getTaskId()); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + updateWrapper.set(TaskInfo::getHeatImg, path); + updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); + } + + @SneakyThrows + @Transactional + @Override + public void exportDoc(HttpServletResponse response, String taskId) { + TaskInfo info = getById(taskId); + response.setContentType("application/octet-stream"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=report.docx"); + Map params = new HashMap<>(); + //巡检报告_20230101(日期)_065930(时分秒) + String fileName = "巡检报告_" + DateUtil.format(info.getStartTime(), "yyyy-MM-dd") + DateUtil.format(info.getStartTime(), "HH:mm:ss"); + String taskNo = info.getTaskNo() + ""; + String deviceName = "中子源探测设备"; + String taskName = info.getTaskName(); + //固定巡检/自主巡检(默认为固定巡检,若中途切换了自主巡检则改为自主巡检) + String taskType = info.getTaskTypeName(); + //n(计数率高于告警阈值则切换自主巡检,开始告警,每走一步记录一次告警信息 + String alarmNum = info.getAlarmNum() + ""; + //开始时间 + String startTime = DateUtil.format(info.getStartTime(), "yyyy-MM-dd HH:mm:ss"); + String endTime = DateUtil.format(info.getEndTime(), "yyyy-MM-dd HH:mm:ss"); + + params.put("fileName", fileName); + params.put("taskNo", taskNo); + params.put("deviceName", deviceName); + params.put("taskName", taskName); + params.put("taskType", taskType); + params.put("alarmNum", alarmNum); + params.put("startTime", startTime); + params.put("endTime", endTime); + //读取 + List records = recordService.selectListByTaskId(info.getId(), info.getRobotId()); + Integer index = 1; + + if (CollectionUtil.isNotEmpty(records)) { + for (AlarmRecord record : records) { + //栅格信息转换 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + record.setX(pointDTO.getX()); + record.setY(pointDTO.getY()); + record.setIndex(index); + index++; + } + } + + params.put("records", records); + ImageEntity mcaImg = new ImageEntity(); + mcaImg.setHeight(600); + mcaImg.setWidth(600); + mcaImg.setUrl(uploadPath + info.getMcaImg()); + mcaImg.setData(WordUtil.getImageBase64(uploadPath + info.getMcaImg())); + params.put("mcaImg", mcaImg); + + ImageEntity routeImg = new ImageEntity(); + routeImg.setHeight(600); + routeImg.setWidth(600); + routeImg.setUrl(uploadPath + info.getRouteImg()); + routeImg.setData(WordUtil.getImageBase64(uploadPath + info.getRouteImg())); + params.put("routeImg", routeImg); + + ImageEntity heatImg = new ImageEntity(); + heatImg.setHeight(600); + heatImg.setWidth(600); + heatImg.setUrl(uploadPath + info.getHeatImg()); + heatImg.setData(WordUtil.getImageBase64(uploadPath + info.getHeatImg())); + params.put("heatImg", heatImg); + + ImageEntity psdImg = new ImageEntity(); + psdImg.setHeight(500); + psdImg.setWidth(500); + psdImg.setUrl(uploadPath + info.getPsdImg()); + psdImg.setData(WordUtil.getImageBase64(uploadPath + info.getPsdImg())); + params.put("psdImg", psdImg); + + WordUtil.exportOutputStream(docTemp, response.getOutputStream(), params); + } + + private String saveHeatImg(String taskId) { + String newFileName = "task\\" + taskId + ".png"; + //读取当前路径图片 + File file = new File("."); + File[] files = file.listFiles((dir, name) -> name.endsWith(".png") && name.startsWith("step")); + //判定当前执行路径最大step图片 + if (files != null && files.length > 0) { + FileUtil.copy(files[files.length - 1], new File(uploadPath + newFileName), true); + } else { + return ""; + } + return newFileName; + } + + /** + * 是否变化 + * + * @param pointDTO 点位DTO + * @param oldPointDTO 缓存dDTO + * @return + */ + private boolean isChange(GridPointDTO pointDTO, GridPointDTO oldPointDTO) { + if (pointDTO.getX().compareTo(oldPointDTO.getX()) == 0 && pointDTO.getY().compareTo(oldPointDTO.getY()) == 0) { + return false; + } + return true; + } + private PathPlanDTO createPlanDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { PathPlanDTO pathPlanDTO = new PathPlanDTO(); pathPlanDTO.setX(pointDTO.getX().intValue() + ""); @@ -209,7 +409,7 @@ return pathInitDTO; } - private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, String robotId) { + private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, RobotInfo robotInfo) { //No.2 新增任务信息 TaskInfo taskInfo = new TaskInfo(); String currDate = DateUtil.format(new Date(), "yyyyMMdd"); @@ -229,30 +429,13 @@ taskInfo.setTaskStatus(0); taskInfo.setStartTime(new Date()); taskInfo.setRouteId(routeInfo.getId()); - taskInfo.setRobotId(Convert.toLong(robotId)); + taskInfo.setRobotId(robotInfo.getId()); + taskInfo.setGridNumber(robotInfo.getGridNumber()); + taskInfo.setGridSize(robotInfo.getGridSize()); save(taskInfo); return taskInfo; } - private void closeTask(StartTrackRequest request, String robotId) { - //关闭操作 - RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); - if (statusInfo.getCurrTaskId() != null) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("update_time", new Date()); - updateWrapper.set("task_status", 1); - updateWrapper.set("end_time", new Date()); - updateWrapper.eq("id", statusInfo.getCurrTaskId()); - update(updateWrapper); - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); - } - //清空任务缓存 - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); - CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); - } - @Override public List getTaskListByStatus(Integer status, Integer taskType, Integer discernType) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -261,5 +444,4 @@ queryWrapper.eq(null != discernType, "discern_type", discernType); return this.list(queryWrapper); } - } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java index e296f3d..06c8bc0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/utils/PcdDownUtil.java @@ -12,7 +12,6 @@ */ public class PcdDownUtil { public static void downPcd(HttpServletResponse response, String urlPath) throws IOException { - response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); OutputStream outputStream = null; @@ -44,4 +43,31 @@ } } + public static void downPcd(OutputStream outputStream, String urlPath) throws IOException { + InputStream inputStream = null; + try { + // 这里URLEncoder.encode可以防止中文乱码 当然和easyExcel没有关系 + URL url = new URL(urlPath); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.connect(); + inputStream = connection.getInputStream(); + //写流操作 + int bytesRead; + byte[] buffer = new byte[8192]; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + inputStream.close(); + } + if (outputStream != null) { + outputStream.close(); + } + } + + } } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/util/WordUtil.java b/casic-server/src/main/java/com/casic/missiles/util/WordUtil.java new file mode 100644 index 0000000..70c7be7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/util/WordUtil.java @@ -0,0 +1,136 @@ +package com.casic.missiles.util; + +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.word.WordExportUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import java.io.*; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class WordUtil { + public void imageWordExport() { + Map map = new HashMap(); + map.put("department", "Easypoi"); + map.put("person", "JueYue"); + map.put("time", DateUtil.format(new Date(), "yyyy-MM-dd")); + ImageEntity image = new ImageEntity(); + image.setHeight(200); + image.setWidth(500); + image.setUrl("cn/afterturn/easypoi/test/word/img/testCode.png"); + image.setType(ImageEntity.URL); + map.put("testCode", image); + try { + XWPFDocument doc = WordExportUtil.exportWord07( + "cn/afterturn/easypoi/test/word/doc/Image.docx", map); + FileOutputStream fos = new FileOutputStream("D:/excel/image.docx"); + doc.write(fos); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * 简单导出没有图片和Excel + */ + public static void SimpleWordExport() { + Map map = new HashMap(); + map.put("department", "Easypoi"); + map.put("person", "JueYue"); + map.put("time", DateUtil.format(new Date(), "yyyy-MM-dd")); + map.put("me", "JueYue"); + map.put("date", "2015-01-03"); + try { + + XWPFDocument doc = WordExportUtil.exportWord07("simple.docx", map); + FileOutputStream fos = new FileOutputStream("C:/excel/simple.docx"); + doc.write(fos); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) throws IOException { +// SimpleWordExport(); + String basePath = "D:\\workspace\\server\\keti\\casic-robot-inspection\\casic-web\\src\\main\\resources\\config\\path\\"; + String tempPath = basePath + "report.docx"; + Map params = new HashMap<>(); + params.put("x", "123"); + + ImageEntity image = new ImageEntity(); + image.setHeight(500); + image.setWidth(500); + image.setUrl(basePath + "routeImg.png"); + image.setData(getImageBase64(basePath + "2.png")); + + params.put("image", image); + exportWord(tempPath, basePath, "X.docx", params); + } + + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + + /** + * 按照模板 填充数据生成word 只支持docx + * + * @param templatePath 模板文件路径 + * @param temDir 生成文件的目录 + * @param fileName 生成文件名 + * @param params 参数 + */ + public static String exportWord(String templatePath, String temDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.getParentFile().exists()) { + // 新建文件夹 + dir.getParentFile().mkdirs(); + } + String tmpPath = ""; + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return tmpPath; + } + + public static void exportOutputStream(String templatePath, OutputStream fos, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 0549422..7e5b423 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -127,6 +127,16 @@ jna 3.0.0 + + com.casic + casic-file + ${extension.version} + + + com.casic + casic-file-support + ${extension.version} + casic-robot-inspection diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index 7d4b29f..9a89795 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -9,6 +9,9 @@ max-file-size: 50MB max-request-size: 80MB # MQTT集成 10.11.1.2 url: tcp://10.11.1.3:1883 tcp://192.168.1.126:1883 + web: + resources: + static-locations: file:C:\casic\tmp\ mqtt: username: admin password: password @@ -42,9 +45,13 @@ algorithm: initPath: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\path\PathPlanning_init.exe planPath: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\path\PathPlanning.exe + doc: + temp: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\path\report.docx config: export-path: D:\java\boot\guns-web-1.0.0-SNAPSHOT\export\ config-path: E:\Develop\IdeaProject\smartcity\casic-smartcity-dcms\casic-web\src\main\resources\config\ + file: + uploadPath: C:\casic\tmp\ server: servlet: context-path: /casic-robot \ No newline at end of file diff --git a/casic-web/src/main/resources/config/path/report.docx b/casic-web/src/main/resources/config/path/report.docx new file mode 100644 index 0000000..d0f2073 --- /dev/null +++ b/casic-web/src/main/resources/config/path/report.docx Binary files differ