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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ 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 java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ 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 java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; import java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ 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 java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; import java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +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.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ 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 java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; import java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +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.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); 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: ",""))); + 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; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ 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 java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; import java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +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.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); 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: ",""))); + 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; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -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.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ 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 java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; import java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +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.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); 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: ",""))); + 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; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -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.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ 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 java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; import java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +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.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); 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: ",""))); + 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; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -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.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java index 59dc5cb..afbf972 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,13 +10,16 @@ import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.RouteInfoMapper; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RobotPointInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.DeleteTrackRequest; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.ArrayList; @@ -35,11 +40,32 @@ @Service public class RouteInfoServiceImpl extends ServiceImpl implements IRouteInfoService { private final IBaseRobotService robotService; + private final IRobotPointInfoService robotPointInfoService; - public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService) { + public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService, @Lazy IRobotPointInfoService robotPointInfoService) { this.robotService = robotService; + this.robotPointInfoService = robotPointInfoService; } + @Transactional + @Override + public List list(Wrapper queryWrapper) { + List routeInfos = super.list(queryWrapper); + routeInfos.forEach(this::wrapInfo); + return routeInfos; + } + + private void wrapInfo(RouteInfo routeInfo) { + if (routeInfo != null) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getId()); + query.orderByAsc(RobotPointInfo::getPointIndex); + List robotPointInfos = robotPointInfoService.list(query); + routeInfo.setPointInfos(robotPointInfos); + } + } + + @Override public List selectRouteInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectRouteInfoPage(page, query); @@ -71,10 +97,10 @@ public List saveListByRouteTargetIds(RobotInfo robotInfo, List result) { //检索当前库中机器人信息表 QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotInfo.getId()); + query.eq("robot_id", robotInfo.getId()); QueryWrapper rmQuery = new QueryWrapper<>(); - rmQuery.notIn("target_id" , result); + rmQuery.notIn("target_id", result); //移除该机器人路线存储信息 remove(rmQuery); @@ -102,8 +128,8 @@ @Override public List getRouteInfoByTargetIds(RobotInfo robotInfo, String track_name) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("robot_id" , robotInfo.getId()); - queryWrapper.eq("target_id" , track_name); + queryWrapper.eq("robot_id", robotInfo.getId()); + queryWrapper.eq("target_id", track_name); return list(queryWrapper); } } \ 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ 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 java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; import java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +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.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); 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: ",""))); + 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; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -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.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java index 59dc5cb..afbf972 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,13 +10,16 @@ import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.RouteInfoMapper; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RobotPointInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.DeleteTrackRequest; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.ArrayList; @@ -35,11 +40,32 @@ @Service public class RouteInfoServiceImpl extends ServiceImpl implements IRouteInfoService { private final IBaseRobotService robotService; + private final IRobotPointInfoService robotPointInfoService; - public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService) { + public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService, @Lazy IRobotPointInfoService robotPointInfoService) { this.robotService = robotService; + this.robotPointInfoService = robotPointInfoService; } + @Transactional + @Override + public List list(Wrapper queryWrapper) { + List routeInfos = super.list(queryWrapper); + routeInfos.forEach(this::wrapInfo); + return routeInfos; + } + + private void wrapInfo(RouteInfo routeInfo) { + if (routeInfo != null) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getId()); + query.orderByAsc(RobotPointInfo::getPointIndex); + List robotPointInfos = robotPointInfoService.list(query); + routeInfo.setPointInfos(robotPointInfos); + } + } + + @Override public List selectRouteInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectRouteInfoPage(page, query); @@ -71,10 +97,10 @@ public List saveListByRouteTargetIds(RobotInfo robotInfo, List result) { //检索当前库中机器人信息表 QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotInfo.getId()); + query.eq("robot_id", robotInfo.getId()); QueryWrapper rmQuery = new QueryWrapper<>(); - rmQuery.notIn("target_id" , result); + rmQuery.notIn("target_id", result); //移除该机器人路线存储信息 remove(rmQuery); @@ -102,8 +128,8 @@ @Override public List getRouteInfoByTargetIds(RobotInfo robotInfo, String track_name) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("robot_id" , robotInfo.getId()); - queryWrapper.eq("target_id" , track_name); + queryWrapper.eq("robot_id", robotInfo.getId()); + queryWrapper.eq("target_id", track_name); return list(queryWrapper); } } \ No newline at end of file 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 f26904b..9b481ce 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 @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -18,13 +19,17 @@ 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.IBaseRobotService; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.*; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; 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.SoftwareStopRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import com.casic.missiles.modular.robot.opt.instruct.dto.TargetPointRequest; import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.util.WordUtil; import lombok.SneakyThrows; @@ -63,13 +68,15 @@ private final ITaskHeatMapService taskHeatMapService; private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + private final IBaseRobotService baseRobotService; + @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) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -77,6 +84,7 @@ this.taskHeatMapService = taskHeatMapService; this.algorithmService = algorithmService; this.cacheService = cacheService; + this.baseRobotService = baseRobotService; } /** @@ -135,8 +143,11 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); - taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); + if (taskInfo != null) { + RobotInfo robotInfo = cacheService.getRobotInfo(taskInfo.getRobotId()); + taskInfo.setRobotName(robotInfo.getRobotName()); + } } @Transactional @@ -172,6 +183,7 @@ 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); @@ -191,13 +203,22 @@ update(updateWrapper); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); } - //清空任务缓存 + robotCacheClean(robotId); + //清空机器当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + + } + + /** + * 关闭任务清空缓存信息 + * + * @param robotId + */ + private void robotCacheClean(String 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); } /** @@ -213,7 +234,7 @@ 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); + 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 中子源阈值未配置"); @@ -229,7 +250,7 @@ Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 @@ -248,6 +269,7 @@ 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 障碍物判定信息 @@ -256,28 +278,78 @@ pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - - //存储算法估算栅格信息 + //存储算法输出栅格信息 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); + //机器人寻点指令下发 + sendTargetPoint(robotInfo, response); } + //是否触发停止状态 if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //机器人停止指令下发 + SoftwareStopRequest request = new SoftwareStopRequest(); + request.setRobotId(robotInfo.getId()); + //设置为急停 + request.setControl(1); + baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + //循迹任务结束 + closeTask(null, robotId); } } } } + /** + * 机器人目标栅格设定 + * + * @param robotInfo 机器人信息 + * @param response 算法输出数据 + */ + private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response) { + //读取已设置巡点目标信息 + PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId()); + //巡点 + if (response.getPointNextDTO() != null && !response.getPointNextDTO().equals(nextDTO)) { + GridPointDTO gridPointDTO = GridPointDTO.convertGridPoint(response.getPointNextDTO()); + //得到寻源栅格数据,转换为栅格目标点位 + GridPointDTO gridCenterPoint = algorithmService.convertGridCenterPoint(gridPointDTO, robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); + TargetPointRequest request = new TargetPointRequest(); + request.setX(Convert.toStr(gridCenterPoint.getX())); + request.setY(Convert.toStr(gridCenterPoint.getY())); + request.setZ("0"); + + request.setRobotId(robotInfo.getId()); + //执行巡点指令 + baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT); + //重设寻点点位 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId(), response.getPointNextDTO()); + } + + } + + /** + * 任务相关图片保存 + * + * @param imgDTO + */ @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()); + if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + } updateWrapper.set(TaskInfo::getHeatImg, path); updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); } @@ -287,6 +359,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=report.docx"); @@ -319,7 +392,7 @@ if (CollectionUtil.isNotEmpty(records)) { for (AlarmRecord record : records) { //栅格信息转换 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize(),robotInfo); record.setX(pointDTO.getX()); record.setY(pointDTO.getY()); record.setIndex(index); 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 aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ 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 java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; import java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +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.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); 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: ",""))); + 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; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -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.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java index 59dc5cb..afbf972 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,13 +10,16 @@ import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.RouteInfoMapper; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RobotPointInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.DeleteTrackRequest; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.ArrayList; @@ -35,11 +40,32 @@ @Service public class RouteInfoServiceImpl extends ServiceImpl implements IRouteInfoService { private final IBaseRobotService robotService; + private final IRobotPointInfoService robotPointInfoService; - public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService) { + public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService, @Lazy IRobotPointInfoService robotPointInfoService) { this.robotService = robotService; + this.robotPointInfoService = robotPointInfoService; } + @Transactional + @Override + public List list(Wrapper queryWrapper) { + List routeInfos = super.list(queryWrapper); + routeInfos.forEach(this::wrapInfo); + return routeInfos; + } + + private void wrapInfo(RouteInfo routeInfo) { + if (routeInfo != null) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getId()); + query.orderByAsc(RobotPointInfo::getPointIndex); + List robotPointInfos = robotPointInfoService.list(query); + routeInfo.setPointInfos(robotPointInfos); + } + } + + @Override public List selectRouteInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectRouteInfoPage(page, query); @@ -71,10 +97,10 @@ public List saveListByRouteTargetIds(RobotInfo robotInfo, List result) { //检索当前库中机器人信息表 QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotInfo.getId()); + query.eq("robot_id", robotInfo.getId()); QueryWrapper rmQuery = new QueryWrapper<>(); - rmQuery.notIn("target_id" , result); + rmQuery.notIn("target_id", result); //移除该机器人路线存储信息 remove(rmQuery); @@ -102,8 +128,8 @@ @Override public List getRouteInfoByTargetIds(RobotInfo robotInfo, String track_name) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("robot_id" , robotInfo.getId()); - queryWrapper.eq("target_id" , track_name); + queryWrapper.eq("robot_id", robotInfo.getId()); + queryWrapper.eq("target_id", track_name); return list(queryWrapper); } } \ No newline at end of file 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 f26904b..9b481ce 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 @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -18,13 +19,17 @@ 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.IBaseRobotService; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.*; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; 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.SoftwareStopRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import com.casic.missiles.modular.robot.opt.instruct.dto.TargetPointRequest; import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.util.WordUtil; import lombok.SneakyThrows; @@ -63,13 +68,15 @@ private final ITaskHeatMapService taskHeatMapService; private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + private final IBaseRobotService baseRobotService; + @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) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -77,6 +84,7 @@ this.taskHeatMapService = taskHeatMapService; this.algorithmService = algorithmService; this.cacheService = cacheService; + this.baseRobotService = baseRobotService; } /** @@ -135,8 +143,11 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); - taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); + if (taskInfo != null) { + RobotInfo robotInfo = cacheService.getRobotInfo(taskInfo.getRobotId()); + taskInfo.setRobotName(robotInfo.getRobotName()); + } } @Transactional @@ -172,6 +183,7 @@ 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); @@ -191,13 +203,22 @@ update(updateWrapper); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); } - //清空任务缓存 + robotCacheClean(robotId); + //清空机器当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + + } + + /** + * 关闭任务清空缓存信息 + * + * @param robotId + */ + private void robotCacheClean(String 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); } /** @@ -213,7 +234,7 @@ 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); + 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 中子源阈值未配置"); @@ -229,7 +250,7 @@ Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 @@ -248,6 +269,7 @@ 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 障碍物判定信息 @@ -256,28 +278,78 @@ pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - - //存储算法估算栅格信息 + //存储算法输出栅格信息 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); + //机器人寻点指令下发 + sendTargetPoint(robotInfo, response); } + //是否触发停止状态 if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //机器人停止指令下发 + SoftwareStopRequest request = new SoftwareStopRequest(); + request.setRobotId(robotInfo.getId()); + //设置为急停 + request.setControl(1); + baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + //循迹任务结束 + closeTask(null, robotId); } } } } + /** + * 机器人目标栅格设定 + * + * @param robotInfo 机器人信息 + * @param response 算法输出数据 + */ + private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response) { + //读取已设置巡点目标信息 + PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId()); + //巡点 + if (response.getPointNextDTO() != null && !response.getPointNextDTO().equals(nextDTO)) { + GridPointDTO gridPointDTO = GridPointDTO.convertGridPoint(response.getPointNextDTO()); + //得到寻源栅格数据,转换为栅格目标点位 + GridPointDTO gridCenterPoint = algorithmService.convertGridCenterPoint(gridPointDTO, robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); + TargetPointRequest request = new TargetPointRequest(); + request.setX(Convert.toStr(gridCenterPoint.getX())); + request.setY(Convert.toStr(gridCenterPoint.getY())); + request.setZ("0"); + + request.setRobotId(robotInfo.getId()); + //执行巡点指令 + baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT); + //重设寻点点位 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId(), response.getPointNextDTO()); + } + + } + + /** + * 任务相关图片保存 + * + * @param imgDTO + */ @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()); + if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + } updateWrapper.set(TaskInfo::getHeatImg, path); updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); } @@ -287,6 +359,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=report.docx"); @@ -319,7 +392,7 @@ if (CollectionUtil.isNotEmpty(records)) { for (AlarmRecord record : records) { //栅格信息转换 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize(),robotInfo); record.setX(pointDTO.getX()); record.setY(pointDTO.getY()); record.setIndex(index); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java index 7e394c1..2e62229 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java @@ -1,10 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.DetectorInfo; -import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** @@ -17,21 +17,25 @@ public class DetectorInfoVO { private static final long serialVersionUID = 1L; - /** 机器人ID */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") - private Long robotId; - /** 探测器名称 */ - @ApiModelProperty(value = "探测器名称" , dataType = "String") - private String detectorName; + /** + * 机器人ID + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long robotId; + /** + * 探测器名称 + */ + @ApiModelProperty(value = "探测器名称", dataType = "String") + private String detectorName; public QueryWrapper genQuery() { QueryWrapper query = new QueryWrapper<>(); -if (robotId!=null) { - query.eq("robot_id",robotId); -} -if (StrUtil.isNotEmpty(detectorName)) { - query.like("detector_name",detectorName); -} + if (robotId != null) { + query.eq("robot_id", robotId); + } + if (StrUtil.isNotEmpty(detectorName)) { + query.like("detector_name", detectorName); + } return query; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ 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 java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; import java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +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.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); 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: ",""))); + 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; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -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.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java index 59dc5cb..afbf972 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,13 +10,16 @@ import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.RouteInfoMapper; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RobotPointInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.DeleteTrackRequest; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.ArrayList; @@ -35,11 +40,32 @@ @Service public class RouteInfoServiceImpl extends ServiceImpl implements IRouteInfoService { private final IBaseRobotService robotService; + private final IRobotPointInfoService robotPointInfoService; - public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService) { + public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService, @Lazy IRobotPointInfoService robotPointInfoService) { this.robotService = robotService; + this.robotPointInfoService = robotPointInfoService; } + @Transactional + @Override + public List list(Wrapper queryWrapper) { + List routeInfos = super.list(queryWrapper); + routeInfos.forEach(this::wrapInfo); + return routeInfos; + } + + private void wrapInfo(RouteInfo routeInfo) { + if (routeInfo != null) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getId()); + query.orderByAsc(RobotPointInfo::getPointIndex); + List robotPointInfos = robotPointInfoService.list(query); + routeInfo.setPointInfos(robotPointInfos); + } + } + + @Override public List selectRouteInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectRouteInfoPage(page, query); @@ -71,10 +97,10 @@ public List saveListByRouteTargetIds(RobotInfo robotInfo, List result) { //检索当前库中机器人信息表 QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotInfo.getId()); + query.eq("robot_id", robotInfo.getId()); QueryWrapper rmQuery = new QueryWrapper<>(); - rmQuery.notIn("target_id" , result); + rmQuery.notIn("target_id", result); //移除该机器人路线存储信息 remove(rmQuery); @@ -102,8 +128,8 @@ @Override public List getRouteInfoByTargetIds(RobotInfo robotInfo, String track_name) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("robot_id" , robotInfo.getId()); - queryWrapper.eq("target_id" , track_name); + queryWrapper.eq("robot_id", robotInfo.getId()); + queryWrapper.eq("target_id", track_name); return list(queryWrapper); } } \ No newline at end of file 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 f26904b..9b481ce 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 @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -18,13 +19,17 @@ 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.IBaseRobotService; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.*; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; 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.SoftwareStopRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import com.casic.missiles.modular.robot.opt.instruct.dto.TargetPointRequest; import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.util.WordUtil; import lombok.SneakyThrows; @@ -63,13 +68,15 @@ private final ITaskHeatMapService taskHeatMapService; private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + private final IBaseRobotService baseRobotService; + @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) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -77,6 +84,7 @@ this.taskHeatMapService = taskHeatMapService; this.algorithmService = algorithmService; this.cacheService = cacheService; + this.baseRobotService = baseRobotService; } /** @@ -135,8 +143,11 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); - taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); + if (taskInfo != null) { + RobotInfo robotInfo = cacheService.getRobotInfo(taskInfo.getRobotId()); + taskInfo.setRobotName(robotInfo.getRobotName()); + } } @Transactional @@ -172,6 +183,7 @@ 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); @@ -191,13 +203,22 @@ update(updateWrapper); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); } - //清空任务缓存 + robotCacheClean(robotId); + //清空机器当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + + } + + /** + * 关闭任务清空缓存信息 + * + * @param robotId + */ + private void robotCacheClean(String 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); } /** @@ -213,7 +234,7 @@ 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); + 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 中子源阈值未配置"); @@ -229,7 +250,7 @@ Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 @@ -248,6 +269,7 @@ 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 障碍物判定信息 @@ -256,28 +278,78 @@ pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - - //存储算法估算栅格信息 + //存储算法输出栅格信息 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); + //机器人寻点指令下发 + sendTargetPoint(robotInfo, response); } + //是否触发停止状态 if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //机器人停止指令下发 + SoftwareStopRequest request = new SoftwareStopRequest(); + request.setRobotId(robotInfo.getId()); + //设置为急停 + request.setControl(1); + baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + //循迹任务结束 + closeTask(null, robotId); } } } } + /** + * 机器人目标栅格设定 + * + * @param robotInfo 机器人信息 + * @param response 算法输出数据 + */ + private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response) { + //读取已设置巡点目标信息 + PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId()); + //巡点 + if (response.getPointNextDTO() != null && !response.getPointNextDTO().equals(nextDTO)) { + GridPointDTO gridPointDTO = GridPointDTO.convertGridPoint(response.getPointNextDTO()); + //得到寻源栅格数据,转换为栅格目标点位 + GridPointDTO gridCenterPoint = algorithmService.convertGridCenterPoint(gridPointDTO, robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); + TargetPointRequest request = new TargetPointRequest(); + request.setX(Convert.toStr(gridCenterPoint.getX())); + request.setY(Convert.toStr(gridCenterPoint.getY())); + request.setZ("0"); + + request.setRobotId(robotInfo.getId()); + //执行巡点指令 + baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT); + //重设寻点点位 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId(), response.getPointNextDTO()); + } + + } + + /** + * 任务相关图片保存 + * + * @param imgDTO + */ @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()); + if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + } updateWrapper.set(TaskInfo::getHeatImg, path); updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); } @@ -287,6 +359,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=report.docx"); @@ -319,7 +392,7 @@ if (CollectionUtil.isNotEmpty(records)) { for (AlarmRecord record : records) { //栅格信息转换 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize(),robotInfo); record.setX(pointDTO.getX()); record.setY(pointDTO.getY()); record.setIndex(index); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java index 7e394c1..2e62229 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java @@ -1,10 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.DetectorInfo; -import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** @@ -17,21 +17,25 @@ public class DetectorInfoVO { private static final long serialVersionUID = 1L; - /** 机器人ID */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") - private Long robotId; - /** 探测器名称 */ - @ApiModelProperty(value = "探测器名称" , dataType = "String") - private String detectorName; + /** + * 机器人ID + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long robotId; + /** + * 探测器名称 + */ + @ApiModelProperty(value = "探测器名称", dataType = "String") + private String detectorName; public QueryWrapper genQuery() { QueryWrapper query = new QueryWrapper<>(); -if (robotId!=null) { - query.eq("robot_id",robotId); -} -if (StrUtil.isNotEmpty(detectorName)) { - query.like("detector_name",detectorName); -} + if (robotId != null) { + query.eq("robot_id", robotId); + } + if (StrUtil.isNotEmpty(detectorName)) { + query.like("detector_name", detectorName); + } return query; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java new file mode 100644 index 0000000..f09eece --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.robot.vo; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 路线点位信息对象VO + * + * @author lwh + * @date 2023-12-14 + */ +@Data +public class RobotPointInfoVO { + private static final long serialVersionUID = 1L; + + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + private Long routeId; + + public QueryWrapper genQuery() { + QueryWrapper query = new QueryWrapper<>(); + if (robotId != null) { + query.eq("robot_id", robotId); + } + if (routeId != null) { + query.eq("route_id", routeId); + } + return query; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ 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 java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; import java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +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.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); 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: ",""))); + 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; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -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.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java index 59dc5cb..afbf972 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,13 +10,16 @@ import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.RouteInfoMapper; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RobotPointInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.DeleteTrackRequest; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.ArrayList; @@ -35,11 +40,32 @@ @Service public class RouteInfoServiceImpl extends ServiceImpl implements IRouteInfoService { private final IBaseRobotService robotService; + private final IRobotPointInfoService robotPointInfoService; - public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService) { + public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService, @Lazy IRobotPointInfoService robotPointInfoService) { this.robotService = robotService; + this.robotPointInfoService = robotPointInfoService; } + @Transactional + @Override + public List list(Wrapper queryWrapper) { + List routeInfos = super.list(queryWrapper); + routeInfos.forEach(this::wrapInfo); + return routeInfos; + } + + private void wrapInfo(RouteInfo routeInfo) { + if (routeInfo != null) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getId()); + query.orderByAsc(RobotPointInfo::getPointIndex); + List robotPointInfos = robotPointInfoService.list(query); + routeInfo.setPointInfos(robotPointInfos); + } + } + + @Override public List selectRouteInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectRouteInfoPage(page, query); @@ -71,10 +97,10 @@ public List saveListByRouteTargetIds(RobotInfo robotInfo, List result) { //检索当前库中机器人信息表 QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotInfo.getId()); + query.eq("robot_id", robotInfo.getId()); QueryWrapper rmQuery = new QueryWrapper<>(); - rmQuery.notIn("target_id" , result); + rmQuery.notIn("target_id", result); //移除该机器人路线存储信息 remove(rmQuery); @@ -102,8 +128,8 @@ @Override public List getRouteInfoByTargetIds(RobotInfo robotInfo, String track_name) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("robot_id" , robotInfo.getId()); - queryWrapper.eq("target_id" , track_name); + queryWrapper.eq("robot_id", robotInfo.getId()); + queryWrapper.eq("target_id", track_name); return list(queryWrapper); } } \ No newline at end of file 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 f26904b..9b481ce 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 @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -18,13 +19,17 @@ 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.IBaseRobotService; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.*; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; 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.SoftwareStopRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import com.casic.missiles.modular.robot.opt.instruct.dto.TargetPointRequest; import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.util.WordUtil; import lombok.SneakyThrows; @@ -63,13 +68,15 @@ private final ITaskHeatMapService taskHeatMapService; private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + private final IBaseRobotService baseRobotService; + @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) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -77,6 +84,7 @@ this.taskHeatMapService = taskHeatMapService; this.algorithmService = algorithmService; this.cacheService = cacheService; + this.baseRobotService = baseRobotService; } /** @@ -135,8 +143,11 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); - taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); + if (taskInfo != null) { + RobotInfo robotInfo = cacheService.getRobotInfo(taskInfo.getRobotId()); + taskInfo.setRobotName(robotInfo.getRobotName()); + } } @Transactional @@ -172,6 +183,7 @@ 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); @@ -191,13 +203,22 @@ update(updateWrapper); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); } - //清空任务缓存 + robotCacheClean(robotId); + //清空机器当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + + } + + /** + * 关闭任务清空缓存信息 + * + * @param robotId + */ + private void robotCacheClean(String 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); } /** @@ -213,7 +234,7 @@ 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); + 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 中子源阈值未配置"); @@ -229,7 +250,7 @@ Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 @@ -248,6 +269,7 @@ 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 障碍物判定信息 @@ -256,28 +278,78 @@ pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - - //存储算法估算栅格信息 + //存储算法输出栅格信息 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); + //机器人寻点指令下发 + sendTargetPoint(robotInfo, response); } + //是否触发停止状态 if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //机器人停止指令下发 + SoftwareStopRequest request = new SoftwareStopRequest(); + request.setRobotId(robotInfo.getId()); + //设置为急停 + request.setControl(1); + baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + //循迹任务结束 + closeTask(null, robotId); } } } } + /** + * 机器人目标栅格设定 + * + * @param robotInfo 机器人信息 + * @param response 算法输出数据 + */ + private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response) { + //读取已设置巡点目标信息 + PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId()); + //巡点 + if (response.getPointNextDTO() != null && !response.getPointNextDTO().equals(nextDTO)) { + GridPointDTO gridPointDTO = GridPointDTO.convertGridPoint(response.getPointNextDTO()); + //得到寻源栅格数据,转换为栅格目标点位 + GridPointDTO gridCenterPoint = algorithmService.convertGridCenterPoint(gridPointDTO, robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); + TargetPointRequest request = new TargetPointRequest(); + request.setX(Convert.toStr(gridCenterPoint.getX())); + request.setY(Convert.toStr(gridCenterPoint.getY())); + request.setZ("0"); + + request.setRobotId(robotInfo.getId()); + //执行巡点指令 + baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT); + //重设寻点点位 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId(), response.getPointNextDTO()); + } + + } + + /** + * 任务相关图片保存 + * + * @param imgDTO + */ @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()); + if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + } updateWrapper.set(TaskInfo::getHeatImg, path); updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); } @@ -287,6 +359,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=report.docx"); @@ -319,7 +392,7 @@ if (CollectionUtil.isNotEmpty(records)) { for (AlarmRecord record : records) { //栅格信息转换 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize(),robotInfo); record.setX(pointDTO.getX()); record.setY(pointDTO.getY()); record.setIndex(index); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java index 7e394c1..2e62229 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java @@ -1,10 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.DetectorInfo; -import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** @@ -17,21 +17,25 @@ public class DetectorInfoVO { private static final long serialVersionUID = 1L; - /** 机器人ID */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") - private Long robotId; - /** 探测器名称 */ - @ApiModelProperty(value = "探测器名称" , dataType = "String") - private String detectorName; + /** + * 机器人ID + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long robotId; + /** + * 探测器名称 + */ + @ApiModelProperty(value = "探测器名称", dataType = "String") + private String detectorName; public QueryWrapper genQuery() { QueryWrapper query = new QueryWrapper<>(); -if (robotId!=null) { - query.eq("robot_id",robotId); -} -if (StrUtil.isNotEmpty(detectorName)) { - query.like("detector_name",detectorName); -} + if (robotId != null) { + query.eq("robot_id", robotId); + } + if (StrUtil.isNotEmpty(detectorName)) { + query.like("detector_name", detectorName); + } return query; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java new file mode 100644 index 0000000..f09eece --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.robot.vo; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 路线点位信息对象VO + * + * @author lwh + * @date 2023-12-14 + */ +@Data +public class RobotPointInfoVO { + private static final long serialVersionUID = 1L; + + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + private Long routeId; + + public QueryWrapper genQuery() { + QueryWrapper query = new QueryWrapper<>(); + if (robotId != null) { + query.eq("robot_id", robotId); + } + if (routeId != null) { + query.eq("route_id", routeId); + } + return query; + } +} diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index bf403dd..db10efc 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 jms: pub-sub-domain: true # session: diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index aa51120..cf7e273 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 @@ -41,4 +41,8 @@ */ String KEY_CUR_XY_POINT = "KEY_CUR_XY_POINT_"; String KEY_CUR_ESTIMATE_GRID = "KEY_CUR_ESTIMATE_GRID_"; + /** + * 机器人巡点栅格 + */ + String KEY_CUR_TARGET_POINT_ID = "CUR_TARGET_POINT_ID_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java new file mode 100644 index 0000000..cdce1a5 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RobotPointInfoController.java @@ -0,0 +1,87 @@ +package com.casic.missiles.modular.robot.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.page.PageFactory; +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.model.form.IdForms; + +import java.util.List; + +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.vo.RobotPointInfoVO; + +/** + * 路线点位信息Controller + * + * @author lwh + * @date 2023-12-14 + */ +@Api(tags = "路线点位信息") +@RestController +@RequestMapping("/robot/pointInfo") +public class RobotPointInfoController extends BaseController { + + private final IRobotPointInfoService robotPointInfoService; + + public RobotPointInfoController(IRobotPointInfoService robotPointInfoService) { + this.robotPointInfoService = robotPointInfoService; + } + + @ApiOperation(value ="列表查询") + @GetMapping(value = "/list") + public ResponseDataDTO> list(RobotPointInfoVO robotPointInfoVO) { + QueryWrapper query = robotPointInfoVO.genQuery(); + return ResponseDataDTO.success(robotPointInfoService.list(query)); + } + + @ApiOperation(value ="分页查询") + @GetMapping(value = "/listPage") + public ResponseDataDTO> listPage(RobotPointInfoVO robotPointInfoVO) { + Page page = PageFactory.defaultPage(); + QueryWrapper query = robotPointInfoVO.genQuery(); + page = robotPointInfoService.page(page, query); + return ResponseDataDTO.success(super.packForBT(page)); + } + + + @ApiOperation(value ="新增接口") + @PostMapping(value = "/add") + public ResponseDataDTO add(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.save(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="修改接口") + @PostMapping(value = "/update") + public ResponseDataDTO update(@RequestBody RobotPointInfo robotPointInfo) { + robotPointInfoService.updateById(robotPointInfo); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="删除接口") + @GetMapping(value = "/delete") + public ResponseDataDTO delete(String id) { + robotPointInfoService.removeById(id); + return ResponseDataDTO.success(); + } + + @ApiOperation("批量删除") + @PostMapping("/batchDelete") + public ResponseDataDTO batchDelete(@RequestBody IdForms ids) { + robotPointInfoService.removeByIds(ids.getIds()); + return ResponseDataDTO.success(); + } + + @ApiOperation(value ="详情查询") + @GetMapping(value = "/detail") + public ResponseDataDTO detail(String id) { + return ResponseDataDTO.success(robotPointInfoService.getById(id)); + } +} 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 d7ef09d..560529c 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 @@ -12,9 +12,11 @@ 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.RobotInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import com.casic.missiles.modular.robot.vo.TaskInfoVO; import io.swagger.annotations.Api; @@ -39,10 +41,12 @@ private final ITaskInfoService taskInfoService; private final IAlgorithmService algorithmService; + private final IRobotInfoService infoService; - public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService) { + public TaskInfoController(ITaskInfoService taskInfoService, IAlgorithmService algorithmService, IRobotInfoService infoService) { this.taskInfoService = taskInfoService; this.algorithmService = algorithmService; + this.infoService = infoService; } /** @@ -81,8 +85,9 @@ @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))); + RobotInfo robotInfo = infoService.getById(pathInitDTO.getRobotId()); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()), new BigDecimal(pathInitDTO.getY()), 10, new BigDecimal(4), robotInfo); + return ResponseDataDTO.success(algorithmService.convertGridCenterPoint(gridPointDTO, 10, new BigDecimal(4), robotInfo)); } @ApiOperation("图片路径保存") @@ -150,6 +155,6 @@ @ApiOperation(value = "导出接口") @GetMapping(value = "/export") public void export(HttpServletResponse response, @ApiParam("任务ID") String taskId) { - taskInfoService.exportDoc(response,taskId); + taskInfoService.exportDoc(response, taskId); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java new file mode 100644 index 0000000..9e7ead1 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/RobotPointInfoMapper.java @@ -0,0 +1,23 @@ +package com.casic.missiles.modular.robot.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import java.util.List; +/** + *

+ * 路线点位信息 Mapper 接口 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface RobotPointInfoMapper extends BaseMapper { +/** +* 路线点位信息 分页检索 +*/ +List selectRobotPointInfoPage( @Param("page") Page page,@Param("ew" ) QueryWrapper query); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml new file mode 100644 index 0000000..9263919 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dao/mapping/RobotPointInfoMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + id , + create_time as createTime , + postion_x as postionX , + postion_y as postionY , + theta , + postion_z as postionZ , + robot_id as robotId , + route_id as routeId , + point_index as pointIndex , + is_key as isKey + + + a.id , + a.create_time + as createTime , + a.postion_x + as postionX , + a.postion_y + as postionY , + a.theta , + a.postion_z + as postionZ , + a.robot_id + as robotId , + a.route_id + as routeId , + a.point_index + as pointIndex , + a.is_key + as isKey + + + + + + and robot_id = #{request.robotId} + + + and route_id = #{request.routeId} + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java index fb7c119..39ff2a2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/dto/GridPointDTO.java @@ -1,5 +1,6 @@ package com.casic.missiles.modular.robot.dto; +import cn.hutool.core.convert.Convert; import lombok.Data; import java.io.Serializable; @@ -9,4 +10,11 @@ public class GridPointDTO implements Serializable { private BigDecimal x; private BigDecimal y; + + public static GridPointDTO convertGridPoint(PointNextDTO nextDTO) { + GridPointDTO gridPointDTO = new GridPointDTO(); + gridPointDTO.setX(Convert.toBigDecimal(nextDTO.getX())); + gridPointDTO.setY(Convert.toBigDecimal(nextDTO.getY())); + return gridPointDTO; + } } 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 f0413d3..9106980 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 @@ -3,11 +3,22 @@ import lombok.Data; import java.io.Serializable; -import java.util.List; @Data public class PointNextDTO implements Serializable { private String x; private String y; private String z; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + PointNextDTO nextDTO = (PointNextDTO) obj; + if (nextDTO.getX().equals(x) && nextDTO.getY().equals(y)) { + return true; + } + return false; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java index e0f946d..2c874c2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotInfo.java @@ -133,10 +133,21 @@ @TableField("grid_number") private Integer gridNumber; + @ApiModelProperty(value = "机器人路线下载地址", dataType = "String") + @TableField("trajectory_path") + private String trajectoryPath; @ApiModelProperty(value = "机器人云台信息", dataType = "Integer") @TableField(exist = false) private DeviceInfo ptzInfo; + @ApiModelProperty(value = "栅格原点坐标x", dataType = "BigDecimal") + @TableField("origin_x") + private BigDecimal originX; + + @ApiModelProperty(value = "栅格原点坐标y", dataType = "BigDecimal") + @TableField("origin_y") + private BigDecimal originY; + @Override public String toString() { return "RobotInfo{" diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java new file mode 100644 index 0000000..aaaccb7 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RobotPointInfo.java @@ -0,0 +1,103 @@ +package com.casic.missiles.modular.robot.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 路线点位信息对象 robot_point_info + * + * @author lwh + * @date 2023-12-14 + */ +@Data +@TableName("robot_point_info") +public class RobotPointInfo extends Model { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键", dataType = "Long") + @TableField("id") + private Long id; + + @ApiModelProperty(value = "创建时间", dataType = "Date") + @TableField("create_time") + private Date createTime; + + @ApiModelProperty(value = "坐标x", dataType = "BigDecimal") + @TableField("postion_x") + private BigDecimal postionX; + + @ApiModelProperty(value = "坐标y", dataType = "BigDecimal") + @TableField("postion_y") + private BigDecimal postionY; + + @ApiModelProperty(value = "小车的theta坐标", dataType = "BigDecimal") + @TableField("theta") + private BigDecimal theta; + + @ApiModelProperty(value = "坐标z", dataType = "BigDecimal") + @TableField("postion_z") + private BigDecimal postionZ; + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + @TableField("robot_id") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + @TableField("route_id") + private Long routeId; + + @ApiModelProperty(value = "点位序号", dataType = "Integer") + @TableField("point_index") + private Integer pointIndex; + + @ApiModelProperty(value = "是否关键点", dataType = "Integer") + @TableField("is_key") + private Integer isKey; + + + @Override + public String toString() { + return "RobotPointInfo{" + + "id=" + id + + "createTime=" + createTime + + "postionX=" + postionX + + "postionY=" + postionY + + "theta=" + theta + + "postionZ=" + postionZ + + "robotId=" + robotId + + "routeId=" + routeId + + "pointIndex=" + pointIndex + + "isKey=" + isKey + + "}"; + } + + public RobotPointInfo() { + } + + public static RobotPointInfo parse(String str) { + if (StrUtil.isNotEmpty(str)) { + RobotPointInfo robotPointInfo = new RobotPointInfo(); + List fields = StrUtil.split(str, ","); + if (CollectionUtil.isNotEmpty(fields)) { + robotPointInfo.setPointIndex(Convert.toInt(fields.get(0))); + robotPointInfo.setPostionX(Convert.toBigDecimal(fields.get(1))); + robotPointInfo.setPostionY(Convert.toBigDecimal(fields.get(2))); + robotPointInfo.setPostionZ(new BigDecimal(0)); + robotPointInfo.setTheta(Convert.toBigDecimal(fields.get(3))); + robotPointInfo.setIsKey(Convert.toInt(fields.get(4))); + } + return robotPointInfo; + } + return null; + } +} \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java index 6eda840..b5070f4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/model/RouteInfo.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.Date; +import java.util.List; /** @@ -20,51 +21,36 @@ public class RouteInfo extends Model { private static final long serialVersionUID = 1L; - /** - * 主键 - */ - @ApiModelProperty(value = "主键" , dataType = "Long") + @ApiModelProperty(value = "主键", dataType = "Long") @TableField("id") private Long id; - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间" , dataType = "Date") + @ApiModelProperty(value = "创建时间", dataType = "Date") @TableField("create_time") private Date createTime; - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间" , dataType = "Date") + @ApiModelProperty(value = "修改时间", dataType = "Date") @TableField("update_time") private Date updateTime; - /** - * 任务类型(1巡检任务) - */ - @ApiModelProperty(value = "任务类型(1巡检任务)" , dataType = "Integer") + @ApiModelProperty(value = "任务类型(1巡检任务)", dataType = "Integer") @TableField("task_type") private Integer taskType; - /** - * 路径名称 - */ - @ApiModelProperty(value = "路径名称" , dataType = "String") + @ApiModelProperty(value = "路径名称", dataType = "String") @TableField("route_name") private String routeName; - /** - * 机器人ID - */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") + @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; - @ApiModelProperty(value = "路线标识" , dataType = "String") + @ApiModelProperty(value = "路线标识", dataType = "String") @TableField("target_id") private String targetId; + @ApiModelProperty(value = "路线点位集合", dataType = "String") + @TableField(exist = false) + private List pointInfos; @Override public String toString() { 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 7da2fa0..49c57dc 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 @@ -62,9 +62,7 @@ @ApiModelProperty(value = "任务类型字典名称", dataType = "String") @TableField(exist = false) private String taskTypeName; - /** - * 识别类型(1中子源识别) - */ + @ApiModelProperty(value = "识别类型(discernType 1中子源识别)", dataType = "Integer") @TableField("discern_type") private Integer discernType; @@ -119,6 +117,9 @@ @ApiModelProperty(value = "机器人ID", dataType = "Long") @TableField("robot_id") private Long robotId; + @ApiModelProperty(value = "机器人名称", dataType = "String") + @TableField(exist = false) + private String robotName; @ApiModelProperty(value = "告警数量", dataType = "Integer") @TableField(exist = false) 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 511df3d..7358ac7 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 @@ -76,6 +76,7 @@ RobotInfo info = robotInfoService.getById(request.getRobotId()); initMonitor(info); } + @Transactional @SneakyThrows @Override @@ -86,9 +87,15 @@ if (StrUtil.isNotEmpty(info.getDefaultTopic())) { String[] topics = info.getDefaultTopic().split(","); - // 订阅默认消息,消息处理器统一处理 - client.subscribe(topics); + try { + // 订阅默认消息,消息处理器统一处理 + client.subscribe(topics); + } catch (Exception e) { + e.printStackTrace(); + log.error("机器人初始订阅异常", e); + } } + BaseRobotCmdDTO cmdDTO = new BaseRobotCmdDTO(); cmdDTO.setRobotId(info.getId()); reloadTrack(cmdDTO); @@ -98,6 +105,7 @@ } } + @Transactional @Override public void reloadTrack(BaseRobotCmdDTO dto) { //线路读取 @@ -112,7 +120,9 @@ request.setRobotId(routeInfo.getRobotId()); request.setSn(routeInfo.getRobotId() + ""); request.setTrack_name(routeInfo.getTargetId()); - execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); +// execCmdHandler(request, InstructCodeEnums.TASKPOINT_LIST); + //机器人路线读取 + robotInfoService.loadTrack(routeInfo); } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java index fe90f30..db3215a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IAlgorithmService.java @@ -4,6 +4,7 @@ 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 java.math.BigDecimal; @@ -29,7 +30,7 @@ * @param gridSize 栅格顶点经纬度 * @return */ - GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); /** * 根据栅格获取栅格中心点位 @@ -38,5 +39,5 @@ * @param gridSize 栅格顶点值 * @return */ - GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); + GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo); } \ 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 e03b965..d7edaee 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.dto.RobotInfoSetDTO; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; import java.util.List; @@ -36,4 +37,11 @@ * @param info */ void loadPcd(RobotInfo info); + + /** + * 加载路线信息 + * + * @param routeInfo 路线信息 + */ + void loadTrack(RouteInfo routeInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java new file mode 100644 index 0000000..39bcf0d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotPointInfoService.java @@ -0,0 +1,31 @@ +package com.casic.missiles.modular.robot.service; + +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.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; + +import java.util.List; + + +/** + *

+ * 路线点位信息 服务类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +public interface IRobotPointInfoService extends IService { + /** + * 路线点位信息 分页检索 + */ + List selectRobotPointInfoPage(Page page, QueryWrapper query); + + /** + * 加载路线点位信息进行保存 + * @param list 路线集合 + */ + void saveList(List list, RouteInfo routeInfo); +} 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 bb7c9d2..112af1e 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 @@ -5,6 +5,7 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import com.casic.missiles.modular.robot.dto.*; +import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskHeatMap; import com.casic.missiles.modular.robot.service.IAlgorithmService; import com.casic.missiles.modular.robot.service.ITaskHeatMapService; @@ -64,9 +65,9 @@ List res = AlgorithmUtils.invokeJob(commends); 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: ",""))); + 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; } @@ -135,9 +136,14 @@ * @param y slam y */ @Override - public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO pointDTO = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); + + //减去栅格原点坐标 + x = x.subtract(robotInfo.getOriginX()); + y = y.subtract(robotInfo.getOriginY()); + pointDTO.setX(x.multiply(scale)); pointDTO.setY(y.multiply(scale)); return pointDTO; @@ -151,18 +157,19 @@ * @param gridSize 栅格顶点值 * @return */ - public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + public GridPointDTO convertGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize, RobotInfo robotInfo) { GridPointDTO centerPoint = new GridPointDTO(); BigDecimal scale = gridSize.divide(new BigDecimal(gridNum), 5, BigDecimal.ROUND_HALF_UP); - //点位转换 BigDecimal slamX = pointDTO.getX().divide(scale, 5, BigDecimal.ROUND_HALF_UP); BigDecimal slamY = pointDTO.getY().divide(scale, 5, BigDecimal.ROUND_HALF_UP); - //中心栅格点位中心添加 centerPoint.setX(slamX.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); centerPoint.setY(slamY.add(scale.divide(new BigDecimal(2), 5, BigDecimal.ROUND_HALF_UP))); + //加上栅格原点坐标 + centerPoint.setX(centerPoint.getX().add(robotInfo.getOriginX())); + centerPoint.setY(centerPoint.getY().add(robotInfo.getOriginY())); return centerPoint; } 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 6925932..c06b7fb 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -14,10 +15,8 @@ import com.casic.missiles.modular.robot.model.DeviceInfo; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; -import com.casic.missiles.modular.robot.service.IDeviceInfoService; -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.model.RouteInfo; +import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.modular.robot.utils.PcdDownUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -28,6 +27,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; +import java.net.URL; +import java.net.URLEncoder; import java.util.List; @@ -45,15 +46,17 @@ private final AbstractDictService dictService; private final IRouteInfoService routeInfoService; private final IDeviceInfoService deviceInfoService; + private final IRobotPointInfoService pointInfoService; @Value("${casic.file.uploadPath}") private String filePath; - public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService) { + public RobotInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, AbstractDictService dictService, @Lazy IRouteInfoService routeInfoService, @Lazy IDeviceInfoService deviceInfoService, @Lazy IRobotPointInfoService pointInfoService) { this.robotStatusInfoService = robotStatusInfoService; this.dictService = dictService; this.routeInfoService = routeInfoService; this.deviceInfoService = deviceInfoService; + this.pointInfoService = pointInfoService; } @Transactional @@ -110,6 +113,22 @@ } } + @Override + public void loadTrack(RouteInfo routeInfo) { + try { + + RobotInfo info = getById(routeInfo.getRobotId()); + String routeName = URLEncoder.encode( routeInfo.getRouteName(),"UTF-8"); + String urlPath = info.getTrajectoryPath() +routeName + "/" + routeName + ".txt"; + URL url = new URL(urlPath); + List list = FileUtil.readLines(url, "UTF-8"); + pointInfoService.saveList(list,routeInfo); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Transactional @Override public List list(Wrapper queryWrapper) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java new file mode 100644 index 0000000..8fc00e6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotPointInfoServiceImpl.java @@ -0,0 +1,51 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.modular.robot.dao.RobotPointInfoMapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import com.casic.missiles.modular.robot.model.RouteInfo; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 路线点位信息 服务实现类 + *

+ * + * @author lwh + * @date 2023-12-14 + */ +@Service +public class RobotPointInfoServiceImpl extends ServiceImpl implements IRobotPointInfoService { + @Override + public List selectRobotPointInfoPage(Page page, QueryWrapper query) { + return this.baseMapper.selectRobotPointInfoPage(page, query); + } + + @Override + public void saveList(List list, RouteInfo routeInfo) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getRobotId()); + remove(query); + + List robotPointInfos = new ArrayList<>(); + for (String point : list) { + RobotPointInfo robotPointInfo = RobotPointInfo.parse(point); + if (robotPointInfo != null) { + robotPointInfo.setRobotId(routeInfo.getRobotId()); + robotPointInfo.setRouteId(routeInfo.getId()); + robotPointInfo.setCreateTime(new Date()); + robotPointInfos.add(robotPointInfo); + } + } + saveBatch(robotPointInfos); + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java index 59dc5cb..afbf972 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RouteInfoServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,13 +10,16 @@ import com.casic.missiles.modular.robot.IBaseRobotService; import com.casic.missiles.modular.robot.dao.RouteInfoMapper; import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.model.RobotPointInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.instruct.base.dto.MessageRequestDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.DeleteTrackRequest; +import com.casic.missiles.modular.robot.service.IRobotPointInfoService; import com.casic.missiles.modular.robot.service.IRouteInfoService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.ArrayList; @@ -35,11 +40,32 @@ @Service public class RouteInfoServiceImpl extends ServiceImpl implements IRouteInfoService { private final IBaseRobotService robotService; + private final IRobotPointInfoService robotPointInfoService; - public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService) { + public RouteInfoServiceImpl(@Lazy IBaseRobotService robotService, @Lazy IRobotPointInfoService robotPointInfoService) { this.robotService = robotService; + this.robotPointInfoService = robotPointInfoService; } + @Transactional + @Override + public List list(Wrapper queryWrapper) { + List routeInfos = super.list(queryWrapper); + routeInfos.forEach(this::wrapInfo); + return routeInfos; + } + + private void wrapInfo(RouteInfo routeInfo) { + if (routeInfo != null) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(RobotPointInfo::getRouteId, routeInfo.getId()); + query.orderByAsc(RobotPointInfo::getPointIndex); + List robotPointInfos = robotPointInfoService.list(query); + routeInfo.setPointInfos(robotPointInfos); + } + } + + @Override public List selectRouteInfoPage(Page page, QueryWrapper query) { return this.baseMapper.selectRouteInfoPage(page, query); @@ -71,10 +97,10 @@ public List saveListByRouteTargetIds(RobotInfo robotInfo, List result) { //检索当前库中机器人信息表 QueryWrapper query = new QueryWrapper<>(); - query.eq("robot_id" , robotInfo.getId()); + query.eq("robot_id", robotInfo.getId()); QueryWrapper rmQuery = new QueryWrapper<>(); - rmQuery.notIn("target_id" , result); + rmQuery.notIn("target_id", result); //移除该机器人路线存储信息 remove(rmQuery); @@ -102,8 +128,8 @@ @Override public List getRouteInfoByTargetIds(RobotInfo robotInfo, String track_name) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("robot_id" , robotInfo.getId()); - queryWrapper.eq("target_id" , track_name); + queryWrapper.eq("robot_id", robotInfo.getId()); + queryWrapper.eq("target_id", track_name); return list(queryWrapper); } } \ No newline at end of file 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 f26904b..9b481ce 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 @@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -18,13 +19,17 @@ 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.IBaseRobotService; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; import com.casic.missiles.modular.robot.dto.*; import com.casic.missiles.modular.robot.model.*; +import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; 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.SoftwareStopRequest; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; +import com.casic.missiles.modular.robot.opt.instruct.dto.TargetPointRequest; import com.casic.missiles.modular.robot.service.*; import com.casic.missiles.util.WordUtil; import lombok.SneakyThrows; @@ -63,13 +68,15 @@ private final ITaskHeatMapService taskHeatMapService; private final IAlgorithmService algorithmService; private final IRobotCacheService cacheService; + private final IBaseRobotService baseRobotService; + @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) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService, @Lazy IBaseRobotService baseRobotService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; @@ -77,6 +84,7 @@ this.taskHeatMapService = taskHeatMapService; this.algorithmService = algorithmService; this.cacheService = cacheService; + this.baseRobotService = baseRobotService; } /** @@ -135,8 +143,11 @@ taskInfo.setTaskStatusName(dictService.getDictNameByCode(RobotDictConstants.TASK_STATUS, taskInfo.getTaskType() + "")); //检索当前任务告警数量 taskInfo.setAlarmNum(recordService.selectCountByTaskId(taskInfo.getId(), taskInfo.getRobotId())); - taskInfo.setHeatMap(taskHeatMapService.getByTaskId(taskInfo.getId())); + if (taskInfo != null) { + RobotInfo robotInfo = cacheService.getRobotInfo(taskInfo.getRobotId()); + taskInfo.setRobotName(robotInfo.getRobotName()); + } } @Transactional @@ -172,6 +183,7 @@ 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); @@ -191,13 +203,22 @@ update(updateWrapper); CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); } - //清空任务缓存 + robotCacheClean(robotId); + //清空机器当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + + } + + /** + * 关闭任务清空缓存信息 + * + * @param robotId + */ + private void robotCacheClean(String 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); } /** @@ -213,7 +234,7 @@ 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); + 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 中子源阈值未配置"); @@ -229,7 +250,7 @@ Integer initValue = cacheService.readTaskInit(longId); //slam经纬度转栅格 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); //No.1 任务初始化 if (initValue != 1) { //执行初始化操作 @@ -248,6 +269,7 @@ 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 障碍物判定信息 @@ -256,28 +278,78 @@ pathPlanDTO.setCount(cacheService.getNeutronCount(longId) + ""); log.debug("heat map -- robotId:{},taskId:{}", robotId, taskId); AlgorithmResponse response = algorithmService.pathPlanning(pathPlanDTO); - - //存储算法估算栅格信息 + //存储算法输出栅格信息 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); + //机器人寻点指令下发 + sendTargetPoint(robotInfo, response); } + //是否触发停止状态 if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { log.debug("task stop-- robotId:{},taskId:{}", robotId, taskId); + //机器人停止指令下发 + SoftwareStopRequest request = new SoftwareStopRequest(); + request.setRobotId(robotInfo.getId()); + //设置为急停 + request.setControl(1); + baseRobotService.execCmdHandler(request, InstructCodeEnums.SOFTWARE_STOP); + //循迹任务结束 + closeTask(null, robotId); } } } } + /** + * 机器人目标栅格设定 + * + * @param robotInfo 机器人信息 + * @param response 算法输出数据 + */ + private void sendTargetPoint(RobotInfo robotInfo, AlgorithmResponse response) { + //读取已设置巡点目标信息 + PointNextDTO nextDTO = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId()); + //巡点 + if (response.getPointNextDTO() != null && !response.getPointNextDTO().equals(nextDTO)) { + GridPointDTO gridPointDTO = GridPointDTO.convertGridPoint(response.getPointNextDTO()); + //得到寻源栅格数据,转换为栅格目标点位 + GridPointDTO gridCenterPoint = algorithmService.convertGridCenterPoint(gridPointDTO, robotInfo.getGridNumber(), robotInfo.getGridSize(),robotInfo); + TargetPointRequest request = new TargetPointRequest(); + request.setX(Convert.toStr(gridCenterPoint.getX())); + request.setY(Convert.toStr(gridCenterPoint.getY())); + request.setZ("0"); + + request.setRobotId(robotInfo.getId()); + //执行巡点指令 + baseRobotService.execCmdHandler(request, InstructCodeEnums.SET_TARGETPOINT); + //重设寻点点位 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TARGET_POINT_ID + robotInfo.getId(), response.getPointNextDTO()); + } + + } + + /** + * 任务相关图片保存 + * + * @param imgDTO + */ @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()); + if (StrUtil.isNotEmpty(imgDTO.getMcaImg())) { + updateWrapper.set(TaskInfo::getMcaImg, imgDTO.getMcaImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getPsdImg())) { + updateWrapper.set(TaskInfo::getPsdImg, imgDTO.getPsdImg()); + } + if (StrUtil.isNotEmpty(imgDTO.getRouteImg())) { + updateWrapper.set(TaskInfo::getRouteImg, imgDTO.getRouteImg()); + } updateWrapper.set(TaskInfo::getHeatImg, path); updateWrapper.eq(TaskInfo::getId, imgDTO.getTaskId()); } @@ -287,6 +359,7 @@ @Override public void exportDoc(HttpServletResponse response, String taskId) { TaskInfo info = getById(taskId); + RobotInfo robotInfo = cacheService.getRobotInfo(info.getRobotId()); response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=report.docx"); @@ -319,7 +392,7 @@ if (CollectionUtil.isNotEmpty(records)) { for (AlarmRecord record : records) { //栅格信息转换 - GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize()); + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(record.getX(), record.getY(), info.getGridNumber(), info.getGridSize(),robotInfo); record.setX(pointDTO.getX()); record.setY(pointDTO.getY()); record.setIndex(index); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java index 7e394c1..2e62229 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/DetectorInfoVO.java @@ -1,10 +1,10 @@ package com.casic.missiles.modular.robot.vo; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.casic.missiles.modular.robot.model.DetectorInfo; -import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; /** @@ -17,21 +17,25 @@ public class DetectorInfoVO { private static final long serialVersionUID = 1L; - /** 机器人ID */ - @ApiModelProperty(value = "机器人ID" , dataType = "Long") - private Long robotId; - /** 探测器名称 */ - @ApiModelProperty(value = "探测器名称" , dataType = "String") - private String detectorName; + /** + * 机器人ID + */ + @ApiModelProperty(value = "机器人ID", dataType = "Long") + private Long robotId; + /** + * 探测器名称 + */ + @ApiModelProperty(value = "探测器名称", dataType = "String") + private String detectorName; public QueryWrapper genQuery() { QueryWrapper query = new QueryWrapper<>(); -if (robotId!=null) { - query.eq("robot_id",robotId); -} -if (StrUtil.isNotEmpty(detectorName)) { - query.like("detector_name",detectorName); -} + if (robotId != null) { + query.eq("robot_id", robotId); + } + if (StrUtil.isNotEmpty(detectorName)) { + query.like("detector_name", detectorName); + } return query; } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java new file mode 100644 index 0000000..f09eece --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/vo/RobotPointInfoVO.java @@ -0,0 +1,35 @@ +package com.casic.missiles.modular.robot.vo; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.modular.robot.model.RobotPointInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 路线点位信息对象VO + * + * @author lwh + * @date 2023-12-14 + */ +@Data +public class RobotPointInfoVO { + private static final long serialVersionUID = 1L; + + + @ApiModelProperty(value = "机器人主键", dataType = "Long") + private Long robotId; + + @ApiModelProperty(value = "路线ID", dataType = "Long") + private Long routeId; + + public QueryWrapper genQuery() { + QueryWrapper query = new QueryWrapper<>(); + if (robotId != null) { + query.eq("robot_id", robotId); + } + if (routeId != null) { + query.eq("route_id", routeId); + } + return query; + } +} diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index bf403dd..db10efc 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -4,9 +4,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://111.198.10.15:11336/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root - password: Casic203 + password: 123456 jms: pub-sub-domain: true # session: diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index b8e78ef..029c779 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -40,8 +40,8 @@ session-invalidate-time: 86400 #session失效时间(只在单机环境下生效,,多机环境在SpringSessionConfig类中配置) 单位:秒 session-validation-interval: 900 #多久检测一次失效的session(只在单机环境下生效) 单位:秒 no-login-urls: /user/login,/kaptcha,/config/baseConfig - hikSdk: D:\code\robot\casic-robot-inspection\casic-web\src\main\resources\config\hiklib\HCNetSDK.dll - hikPlay: D:\code\robot\casic-robot-inspection\casic-web\src\main\resources\config\hiklib\PlayCtrl.dll + hikSdk: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\hiklib\HCNetSDK.dll + hikPlay: D:\workspace\server\keti\casic-robot-inspection\casic-web\src\main\resources\config\hiklib\PlayCtrl.dll 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