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 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } 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 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 985c7f9..40c885a 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 @@ -115,7 +115,9 @@ @ApiModelProperty(value = "告警阈值配置", dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; - + @ApiModelProperty(value = "告警阈值上限", dataType = "String") + @TableField("max_threshold") + private BigDecimal maxThreshold; @ApiModelProperty(value = "电压上限", dataType = "Integer") @TableField("voltage_max") private Integer voltageMax; 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 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 985c7f9..40c885a 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 @@ -115,7 +115,9 @@ @ApiModelProperty(value = "告警阈值配置", dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; - + @ApiModelProperty(value = "告警阈值上限", dataType = "String") + @TableField("max_threshold") + private BigDecimal maxThreshold; @ApiModelProperty(value = "电压上限", dataType = "Integer") @TableField("voltage_max") private Integer voltageMax; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index a5f0b12..00e34b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -5,6 +5,7 @@ import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.model.RouteKeyPointInfo; +import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; @@ -14,6 +15,7 @@ import com.casic.missiles.modular.robot.service.IRouteKeyPointInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -35,6 +37,7 @@ * @param enums 指令集 * @return */ + @Transactional @Override public ResponseDataDTO senderCmd(StartTrackRequest request, InstructCodeEnums enums) { MessageRequestDTO messageDTO = new MessageRequestDTO(); 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 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 985c7f9..40c885a 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 @@ -115,7 +115,9 @@ @ApiModelProperty(value = "告警阈值配置", dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; - + @ApiModelProperty(value = "告警阈值上限", dataType = "String") + @TableField("max_threshold") + private BigDecimal maxThreshold; @ApiModelProperty(value = "电压上限", dataType = "Integer") @TableField("voltage_max") private Integer voltageMax; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index a5f0b12..00e34b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -5,6 +5,7 @@ import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.model.RouteKeyPointInfo; +import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; @@ -14,6 +15,7 @@ import com.casic.missiles.modular.robot.service.IRouteKeyPointInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -35,6 +37,7 @@ * @param enums 指令集 * @return */ + @Transactional @Override public ResponseDataDTO senderCmd(StartTrackRequest request, InstructCodeEnums enums) { MessageRequestDTO messageDTO = new MessageRequestDTO(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..1bc34e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; @@ -16,6 +17,7 @@ private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { this.robotTrajectoryInfoService = robotTrajectoryInfoService; } 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 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 985c7f9..40c885a 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 @@ -115,7 +115,9 @@ @ApiModelProperty(value = "告警阈值配置", dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; - + @ApiModelProperty(value = "告警阈值上限", dataType = "String") + @TableField("max_threshold") + private BigDecimal maxThreshold; @ApiModelProperty(value = "电压上限", dataType = "Integer") @TableField("voltage_max") private Integer voltageMax; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index a5f0b12..00e34b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -5,6 +5,7 @@ import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.model.RouteKeyPointInfo; +import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; @@ -14,6 +15,7 @@ import com.casic.missiles.modular.robot.service.IRouteKeyPointInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -35,6 +37,7 @@ * @param enums 指令集 * @return */ + @Transactional @Override public ResponseDataDTO senderCmd(StartTrackRequest request, InstructCodeEnums enums) { MessageRequestDTO messageDTO = new MessageRequestDTO(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..1bc34e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; @@ -16,6 +17,7 @@ private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { this.robotTrajectoryInfoService = robotTrajectoryInfoService; } 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 b570568..fe90f30 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 @@ -30,4 +30,13 @@ * @return */ GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + + /** + * 根据栅格获取栅格中心点位 + * @param pointDTO 栅格坐标 + * @param gridNum 栅格总数 + * @param gridSize 栅格顶点值 + * @return + */ + GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); } \ 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 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 985c7f9..40c885a 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 @@ -115,7 +115,9 @@ @ApiModelProperty(value = "告警阈值配置", dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; - + @ApiModelProperty(value = "告警阈值上限", dataType = "String") + @TableField("max_threshold") + private BigDecimal maxThreshold; @ApiModelProperty(value = "电压上限", dataType = "Integer") @TableField("voltage_max") private Integer voltageMax; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index a5f0b12..00e34b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -5,6 +5,7 @@ import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.model.RouteKeyPointInfo; +import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; @@ -14,6 +15,7 @@ import com.casic.missiles.modular.robot.service.IRouteKeyPointInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -35,6 +37,7 @@ * @param enums 指令集 * @return */ + @Transactional @Override public ResponseDataDTO senderCmd(StartTrackRequest request, InstructCodeEnums enums) { MessageRequestDTO messageDTO = new MessageRequestDTO(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..1bc34e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; @@ -16,6 +17,7 @@ private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { this.robotTrajectoryInfoService = robotTrajectoryInfoService; } 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 b570568..fe90f30 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 @@ -30,4 +30,13 @@ * @return */ GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + + /** + * 根据栅格获取栅格中心点位 + * @param pointDTO 栅格坐标 + * @param gridNum 栅格总数 + * @param gridSize 栅格顶点值 + * @return + */ + GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java new file mode 100644 index 0000000..936c9bd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.robot.service; + +import com.casic.missiles.modular.robot.model.RobotInfo; + +/** + * 机器人缓存服务 + */ +public interface IRobotCacheService { + /** + * 读取机器人当前任务ID + * + * @param robotId + * @return + */ + Long readTaskId(Long robotId); + + /** + * 读取机器人当前路线ID + * + * @param robotId + * @return + */ + Long readRouteId(Long robotId); + + /** + * 算法初始化状态读取 + * @param robotId 机器人ID + * @return 机器人状态 + */ + Integer readTaskInit(Long robotId); + + /** + * 更新机器人任务ID + * + * @param robotId 机器人ID + * @param taskId 任务ID + * @return + */ + boolean updateTaskId(Long robotId, Long taskId); + + /** + * 更新机器人任务初始化完成标志 + * @param robotId 机器人id + * @param val 值 + * @return + */ + boolean updateTaskInit(Long robotId,Integer val); + + RobotInfo getRobotInfo(Long robotId); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 985c7f9..40c885a 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 @@ -115,7 +115,9 @@ @ApiModelProperty(value = "告警阈值配置", dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; - + @ApiModelProperty(value = "告警阈值上限", dataType = "String") + @TableField("max_threshold") + private BigDecimal maxThreshold; @ApiModelProperty(value = "电压上限", dataType = "Integer") @TableField("voltage_max") private Integer voltageMax; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index a5f0b12..00e34b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -5,6 +5,7 @@ import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.model.RouteKeyPointInfo; +import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; @@ -14,6 +15,7 @@ import com.casic.missiles.modular.robot.service.IRouteKeyPointInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -35,6 +37,7 @@ * @param enums 指令集 * @return */ + @Transactional @Override public ResponseDataDTO senderCmd(StartTrackRequest request, InstructCodeEnums enums) { MessageRequestDTO messageDTO = new MessageRequestDTO(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..1bc34e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; @@ -16,6 +17,7 @@ private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { this.robotTrajectoryInfoService = robotTrajectoryInfoService; } 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 b570568..fe90f30 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 @@ -30,4 +30,13 @@ * @return */ GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + + /** + * 根据栅格获取栅格中心点位 + * @param pointDTO 栅格坐标 + * @param gridNum 栅格总数 + * @param gridSize 栅格顶点值 + * @return + */ + GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java new file mode 100644 index 0000000..936c9bd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.robot.service; + +import com.casic.missiles.modular.robot.model.RobotInfo; + +/** + * 机器人缓存服务 + */ +public interface IRobotCacheService { + /** + * 读取机器人当前任务ID + * + * @param robotId + * @return + */ + Long readTaskId(Long robotId); + + /** + * 读取机器人当前路线ID + * + * @param robotId + * @return + */ + Long readRouteId(Long robotId); + + /** + * 算法初始化状态读取 + * @param robotId 机器人ID + * @return 机器人状态 + */ + Integer readTaskInit(Long robotId); + + /** + * 更新机器人任务ID + * + * @param robotId 机器人ID + * @param taskId 任务ID + * @return + */ + boolean updateTaskId(Long robotId, Long taskId); + + /** + * 更新机器人任务初始化完成标志 + * @param robotId 机器人id + * @param val 值 + * @return + */ + boolean updateTaskInit(Long robotId,Integer val); + + RobotInfo getRobotInfo(Long robotId); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index 7b63157..c491462 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import java.util.List; @@ -34,10 +35,18 @@ /** * 根据状态和类型查询任务 + * * @param status * @param taskType * @param discernType * @return */ - List getTaskListByStatus(Integer status,Integer taskType,Integer discernType); + List getTaskListByStatus(Integer status, Integer taskType, Integer discernType); + + /** + * 点位接收信息回调 + * + * @param dto 实体 + */ + void pointCallBack(PoseMessageResponseDTO dto,String robotId); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 985c7f9..40c885a 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 @@ -115,7 +115,9 @@ @ApiModelProperty(value = "告警阈值配置", dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; - + @ApiModelProperty(value = "告警阈值上限", dataType = "String") + @TableField("max_threshold") + private BigDecimal maxThreshold; @ApiModelProperty(value = "电压上限", dataType = "Integer") @TableField("voltage_max") private Integer voltageMax; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index a5f0b12..00e34b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -5,6 +5,7 @@ import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.model.RouteKeyPointInfo; +import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; @@ -14,6 +15,7 @@ import com.casic.missiles.modular.robot.service.IRouteKeyPointInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -35,6 +37,7 @@ * @param enums 指令集 * @return */ + @Transactional @Override public ResponseDataDTO senderCmd(StartTrackRequest request, InstructCodeEnums enums) { MessageRequestDTO messageDTO = new MessageRequestDTO(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..1bc34e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; @@ -16,6 +17,7 @@ private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { this.robotTrajectoryInfoService = robotTrajectoryInfoService; } 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 b570568..fe90f30 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 @@ -30,4 +30,13 @@ * @return */ GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + + /** + * 根据栅格获取栅格中心点位 + * @param pointDTO 栅格坐标 + * @param gridNum 栅格总数 + * @param gridSize 栅格顶点值 + * @return + */ + GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java new file mode 100644 index 0000000..936c9bd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.robot.service; + +import com.casic.missiles.modular.robot.model.RobotInfo; + +/** + * 机器人缓存服务 + */ +public interface IRobotCacheService { + /** + * 读取机器人当前任务ID + * + * @param robotId + * @return + */ + Long readTaskId(Long robotId); + + /** + * 读取机器人当前路线ID + * + * @param robotId + * @return + */ + Long readRouteId(Long robotId); + + /** + * 算法初始化状态读取 + * @param robotId 机器人ID + * @return 机器人状态 + */ + Integer readTaskInit(Long robotId); + + /** + * 更新机器人任务ID + * + * @param robotId 机器人ID + * @param taskId 任务ID + * @return + */ + boolean updateTaskId(Long robotId, Long taskId); + + /** + * 更新机器人任务初始化完成标志 + * @param robotId 机器人id + * @param val 值 + * @return + */ + boolean updateTaskInit(Long robotId,Integer val); + + RobotInfo getRobotInfo(Long robotId); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index 7b63157..c491462 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import java.util.List; @@ -34,10 +35,18 @@ /** * 根据状态和类型查询任务 + * * @param status * @param taskType * @param discernType * @return */ - List getTaskListByStatus(Integer status,Integer taskType,Integer discernType); + List getTaskListByStatus(Integer status, Integer taskType, Integer discernType); + + /** + * 点位接收信息回调 + * + * @param dto 实体 + */ + void pointCallBack(PoseMessageResponseDTO dto,String robotId); } 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 a4882c7..ccd3f90 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 @@ -125,6 +125,30 @@ } /** + * 根据栅格读取栅格中心点位信息 + * + * @param pointDTO 栅格信息 + * @param gridNum 栅格数 + * @param gridSize 栅格顶点值 + * @return + */ + public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + + 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))); + + return centerPoint; + } + + /** * 数值格式化 * * @param str 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 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 985c7f9..40c885a 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 @@ -115,7 +115,9 @@ @ApiModelProperty(value = "告警阈值配置", dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; - + @ApiModelProperty(value = "告警阈值上限", dataType = "String") + @TableField("max_threshold") + private BigDecimal maxThreshold; @ApiModelProperty(value = "电压上限", dataType = "Integer") @TableField("voltage_max") private Integer voltageMax; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index a5f0b12..00e34b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -5,6 +5,7 @@ import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.model.RouteKeyPointInfo; +import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; @@ -14,6 +15,7 @@ import com.casic.missiles.modular.robot.service.IRouteKeyPointInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -35,6 +37,7 @@ * @param enums 指令集 * @return */ + @Transactional @Override public ResponseDataDTO senderCmd(StartTrackRequest request, InstructCodeEnums enums) { MessageRequestDTO messageDTO = new MessageRequestDTO(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..1bc34e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; @@ -16,6 +17,7 @@ private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { this.robotTrajectoryInfoService = robotTrajectoryInfoService; } 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 b570568..fe90f30 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 @@ -30,4 +30,13 @@ * @return */ GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + + /** + * 根据栅格获取栅格中心点位 + * @param pointDTO 栅格坐标 + * @param gridNum 栅格总数 + * @param gridSize 栅格顶点值 + * @return + */ + GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java new file mode 100644 index 0000000..936c9bd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.robot.service; + +import com.casic.missiles.modular.robot.model.RobotInfo; + +/** + * 机器人缓存服务 + */ +public interface IRobotCacheService { + /** + * 读取机器人当前任务ID + * + * @param robotId + * @return + */ + Long readTaskId(Long robotId); + + /** + * 读取机器人当前路线ID + * + * @param robotId + * @return + */ + Long readRouteId(Long robotId); + + /** + * 算法初始化状态读取 + * @param robotId 机器人ID + * @return 机器人状态 + */ + Integer readTaskInit(Long robotId); + + /** + * 更新机器人任务ID + * + * @param robotId 机器人ID + * @param taskId 任务ID + * @return + */ + boolean updateTaskId(Long robotId, Long taskId); + + /** + * 更新机器人任务初始化完成标志 + * @param robotId 机器人id + * @param val 值 + * @return + */ + boolean updateTaskInit(Long robotId,Integer val); + + RobotInfo getRobotInfo(Long robotId); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index 7b63157..c491462 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import java.util.List; @@ -34,10 +35,18 @@ /** * 根据状态和类型查询任务 + * * @param status * @param taskType * @param discernType * @return */ - List getTaskListByStatus(Integer status,Integer taskType,Integer discernType); + List getTaskListByStatus(Integer status, Integer taskType, Integer discernType); + + /** + * 点位接收信息回调 + * + * @param dto 实体 + */ + void pointCallBack(PoseMessageResponseDTO dto,String robotId); } 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 a4882c7..ccd3f90 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 @@ -125,6 +125,30 @@ } /** + * 根据栅格读取栅格中心点位信息 + * + * @param pointDTO 栅格信息 + * @param gridNum 栅格数 + * @param gridSize 栅格顶点值 + * @return + */ + public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + + 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))); + + return centerPoint; + } + + /** * 数值格式化 * * @param str diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java new file mode 100644 index 0000000..f0aef00 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.service.IRobotCacheService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Service; + +@Service +public class RobotCacheServiceImpl implements IRobotCacheService { + private final IRobotInfoService robotInfoService; + + public RobotCacheServiceImpl(IRobotInfoService robotInfoService) { + this.robotInfoService = robotInfoService; + } + + @Override + public synchronized boolean updateTaskId(Long robotId, Long taskId) { + //读取当前机器人任务信息 + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + if (currId == taskId) { + return false; + } else { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, taskId); + return true; + } + } + + /** + * 锁机制 更新初始化标志 + * + * @param robotId 机器人id + * @param val 值 + * @return + */ + @Override + public synchronized boolean updateTaskInit(Long robotId, Integer val) { + Integer currVal = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + if (currVal == 1) { + return false; + } else { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, val); + return true; + } + } + + @Override + public RobotInfo getRobotInfo(Long robotId) { + return robotInfoService.getById(robotId); + } + + @Override + public Long readTaskId(Long robotId) { + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + return currId; + } + + @Override + public Long readRouteId(Long robotId) { + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + return currId; + } + + @Override + public Integer readTaskInit(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + return currId; + } + + +} 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 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 985c7f9..40c885a 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 @@ -115,7 +115,9 @@ @ApiModelProperty(value = "告警阈值配置", dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; - + @ApiModelProperty(value = "告警阈值上限", dataType = "String") + @TableField("max_threshold") + private BigDecimal maxThreshold; @ApiModelProperty(value = "电压上限", dataType = "Integer") @TableField("voltage_max") private Integer voltageMax; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index a5f0b12..00e34b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -5,6 +5,7 @@ import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.model.RouteKeyPointInfo; +import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; @@ -14,6 +15,7 @@ import com.casic.missiles.modular.robot.service.IRouteKeyPointInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -35,6 +37,7 @@ * @param enums 指令集 * @return */ + @Transactional @Override public ResponseDataDTO senderCmd(StartTrackRequest request, InstructCodeEnums enums) { MessageRequestDTO messageDTO = new MessageRequestDTO(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..1bc34e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; @@ -16,6 +17,7 @@ private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { this.robotTrajectoryInfoService = robotTrajectoryInfoService; } 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 b570568..fe90f30 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 @@ -30,4 +30,13 @@ * @return */ GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + + /** + * 根据栅格获取栅格中心点位 + * @param pointDTO 栅格坐标 + * @param gridNum 栅格总数 + * @param gridSize 栅格顶点值 + * @return + */ + GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java new file mode 100644 index 0000000..936c9bd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.robot.service; + +import com.casic.missiles.modular.robot.model.RobotInfo; + +/** + * 机器人缓存服务 + */ +public interface IRobotCacheService { + /** + * 读取机器人当前任务ID + * + * @param robotId + * @return + */ + Long readTaskId(Long robotId); + + /** + * 读取机器人当前路线ID + * + * @param robotId + * @return + */ + Long readRouteId(Long robotId); + + /** + * 算法初始化状态读取 + * @param robotId 机器人ID + * @return 机器人状态 + */ + Integer readTaskInit(Long robotId); + + /** + * 更新机器人任务ID + * + * @param robotId 机器人ID + * @param taskId 任务ID + * @return + */ + boolean updateTaskId(Long robotId, Long taskId); + + /** + * 更新机器人任务初始化完成标志 + * @param robotId 机器人id + * @param val 值 + * @return + */ + boolean updateTaskInit(Long robotId,Integer val); + + RobotInfo getRobotInfo(Long robotId); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index 7b63157..c491462 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import java.util.List; @@ -34,10 +35,18 @@ /** * 根据状态和类型查询任务 + * * @param status * @param taskType * @param discernType * @return */ - List getTaskListByStatus(Integer status,Integer taskType,Integer discernType); + List getTaskListByStatus(Integer status, Integer taskType, Integer discernType); + + /** + * 点位接收信息回调 + * + * @param dto 实体 + */ + void pointCallBack(PoseMessageResponseDTO dto,String robotId); } 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 a4882c7..ccd3f90 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 @@ -125,6 +125,30 @@ } /** + * 根据栅格读取栅格中心点位信息 + * + * @param pointDTO 栅格信息 + * @param gridNum 栅格数 + * @param gridSize 栅格顶点值 + * @return + */ + public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + + 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))); + + return centerPoint; + } + + /** * 数值格式化 * * @param str diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java new file mode 100644 index 0000000..f0aef00 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.service.IRobotCacheService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Service; + +@Service +public class RobotCacheServiceImpl implements IRobotCacheService { + private final IRobotInfoService robotInfoService; + + public RobotCacheServiceImpl(IRobotInfoService robotInfoService) { + this.robotInfoService = robotInfoService; + } + + @Override + public synchronized boolean updateTaskId(Long robotId, Long taskId) { + //读取当前机器人任务信息 + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + if (currId == taskId) { + return false; + } else { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, taskId); + return true; + } + } + + /** + * 锁机制 更新初始化标志 + * + * @param robotId 机器人id + * @param val 值 + * @return + */ + @Override + public synchronized boolean updateTaskInit(Long robotId, Integer val) { + Integer currVal = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + if (currVal == 1) { + return false; + } else { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, val); + return true; + } + } + + @Override + public RobotInfo getRobotInfo(Long robotId) { + return robotInfoService.getById(robotId); + } + + @Override + public Long readTaskId(Long robotId) { + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + return currId; + } + + @Override + public Long readRouteId(Long robotId) { + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + return currId; + } + + @Override + public Integer readTaskInit(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + return currId; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index 33359e9..54c2c42 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -31,9 +32,11 @@ @Service public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; + private final ITaskInfoService infoService; - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { this.robotStatusInfoService = robotStatusInfoService; + this.infoService = infoService; } @Override @@ -62,6 +65,11 @@ info.setPostionZ(dto.getZ()); info.setTheta(dto.getTheta()); save(info); + try { + infoService.pointCallBack(dto, robotId); + } catch (Exception e) { + log.error("task error", e); + } } } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 985c7f9..40c885a 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 @@ -115,7 +115,9 @@ @ApiModelProperty(value = "告警阈值配置", dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; - + @ApiModelProperty(value = "告警阈值上限", dataType = "String") + @TableField("max_threshold") + private BigDecimal maxThreshold; @ApiModelProperty(value = "电压上限", dataType = "Integer") @TableField("voltage_max") private Integer voltageMax; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index a5f0b12..00e34b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -5,6 +5,7 @@ import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.model.RouteKeyPointInfo; +import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; @@ -14,6 +15,7 @@ import com.casic.missiles.modular.robot.service.IRouteKeyPointInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -35,6 +37,7 @@ * @param enums 指令集 * @return */ + @Transactional @Override public ResponseDataDTO senderCmd(StartTrackRequest request, InstructCodeEnums enums) { MessageRequestDTO messageDTO = new MessageRequestDTO(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..1bc34e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; @@ -16,6 +17,7 @@ private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { this.robotTrajectoryInfoService = robotTrajectoryInfoService; } 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 b570568..fe90f30 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 @@ -30,4 +30,13 @@ * @return */ GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + + /** + * 根据栅格获取栅格中心点位 + * @param pointDTO 栅格坐标 + * @param gridNum 栅格总数 + * @param gridSize 栅格顶点值 + * @return + */ + GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java new file mode 100644 index 0000000..936c9bd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.robot.service; + +import com.casic.missiles.modular.robot.model.RobotInfo; + +/** + * 机器人缓存服务 + */ +public interface IRobotCacheService { + /** + * 读取机器人当前任务ID + * + * @param robotId + * @return + */ + Long readTaskId(Long robotId); + + /** + * 读取机器人当前路线ID + * + * @param robotId + * @return + */ + Long readRouteId(Long robotId); + + /** + * 算法初始化状态读取 + * @param robotId 机器人ID + * @return 机器人状态 + */ + Integer readTaskInit(Long robotId); + + /** + * 更新机器人任务ID + * + * @param robotId 机器人ID + * @param taskId 任务ID + * @return + */ + boolean updateTaskId(Long robotId, Long taskId); + + /** + * 更新机器人任务初始化完成标志 + * @param robotId 机器人id + * @param val 值 + * @return + */ + boolean updateTaskInit(Long robotId,Integer val); + + RobotInfo getRobotInfo(Long robotId); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index 7b63157..c491462 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import java.util.List; @@ -34,10 +35,18 @@ /** * 根据状态和类型查询任务 + * * @param status * @param taskType * @param discernType * @return */ - List getTaskListByStatus(Integer status,Integer taskType,Integer discernType); + List getTaskListByStatus(Integer status, Integer taskType, Integer discernType); + + /** + * 点位接收信息回调 + * + * @param dto 实体 + */ + void pointCallBack(PoseMessageResponseDTO dto,String robotId); } 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 a4882c7..ccd3f90 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 @@ -125,6 +125,30 @@ } /** + * 根据栅格读取栅格中心点位信息 + * + * @param pointDTO 栅格信息 + * @param gridNum 栅格数 + * @param gridSize 栅格顶点值 + * @return + */ + public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + + 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))); + + return centerPoint; + } + + /** * 数值格式化 * * @param str diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java new file mode 100644 index 0000000..f0aef00 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.service.IRobotCacheService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Service; + +@Service +public class RobotCacheServiceImpl implements IRobotCacheService { + private final IRobotInfoService robotInfoService; + + public RobotCacheServiceImpl(IRobotInfoService robotInfoService) { + this.robotInfoService = robotInfoService; + } + + @Override + public synchronized boolean updateTaskId(Long robotId, Long taskId) { + //读取当前机器人任务信息 + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + if (currId == taskId) { + return false; + } else { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, taskId); + return true; + } + } + + /** + * 锁机制 更新初始化标志 + * + * @param robotId 机器人id + * @param val 值 + * @return + */ + @Override + public synchronized boolean updateTaskInit(Long robotId, Integer val) { + Integer currVal = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + if (currVal == 1) { + return false; + } else { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, val); + return true; + } + } + + @Override + public RobotInfo getRobotInfo(Long robotId) { + return robotInfoService.getById(robotId); + } + + @Override + public Long readTaskId(Long robotId) { + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + return currId; + } + + @Override + public Long readRouteId(Long robotId) { + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + return currId; + } + + @Override + public Integer readTaskInit(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + return currId; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index 33359e9..54c2c42 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -31,9 +32,11 @@ @Service public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; + private final ITaskInfoService infoService; - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { this.robotStatusInfoService = robotStatusInfoService; + this.infoService = infoService; } @Override @@ -62,6 +65,11 @@ info.setPostionZ(dto.getZ()); info.setTheta(dto.getTheta()); save(info); + try { + infoService.pointCallBack(dto, robotId); + } catch (Exception e) { + log.error("task error", e); + } } } } 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 c0fd233..f5fefc2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -1,8 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -10,20 +10,27 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; +import com.casic.missiles.modular.robot.dto.GridPointDTO; +import com.casic.missiles.modular.robot.dto.PathInitDTO; +import com.casic.missiles.modular.robot.dto.PathPlanDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import com.casic.missiles.modular.robot.service.*; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -36,6 +43,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Service public class TaskInfoServiceImpl extends ServiceImpl implements ITaskInfoService { private final IRouteInfoService routeInfoService; @@ -43,13 +51,17 @@ private final AbstractDictService dictService; private final IAlarmRecordService recordService; private final ITaskHeatMapService taskHeatMapService; + private final IAlgorithmService algorithmService; + private final IRobotCacheService cacheService; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; this.recordService = recordService; this.taskHeatMapService = taskHeatMapService; + this.algorithmService = algorithmService; + this.cacheService = cacheService; } @Override @@ -85,60 +97,160 @@ @Transactional @Override public void reloadTask(StartTrackRequest request, RobotInfo info) { - String robotId = info.getId() + ""; - //开启操作 if (request.getAction() == 1) { - QueryWrapper query = new QueryWrapper<>(); - query.eq("target_id", request.getTrack_name()); - List routeInfos = routeInfoService.list(query); - - if (CollectionUtil.isEmpty(routeInfos)) { - throw new ServiceException(500, "路线不存在,请及时更新"); - } - RouteInfo routeInfo = routeInfos.get(0); - //No.2 新增任务信息 - TaskInfo taskInfo = new TaskInfo(); - String currDate = DateUtil.format(new Date(), "yyyyMMdd"); - Long maxNo = this.baseMapper.selectMaxNo(currDate + "%"); - if (new Long(0L).equals(maxNo)) { - maxNo = new Long(currDate + String.format("%07d", 1)); - } else { - maxNo = maxNo + 1; - } - taskInfo.setTaskNo(maxNo); - taskInfo.setCreateTime(new Date()); - //任务类型 中子源 - taskInfo.setTaskType(1); - taskInfo.setDiscernType(1); - taskInfo.setTaskName(routeInfo.getRouteName() + "巡线任务"); - //执行状态 未完成 - taskInfo.setTaskStatus(0); - taskInfo.setStartTime(new Date()); - taskInfo.setRouteId(routeInfo.getId()); - taskInfo.setRobotId(info.getId()); - save(taskInfo); - - //No.3 更新 - Long currRouteId = routeInfo.getId(); - Long currTaskId = taskInfo.getId(); - statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + openTask(request, info.getId() + ""); } else { - //关闭操作 - RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); - if (statusInfo.getCurrTaskId() != null) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("update_time", new Date()); - updateWrapper.set("task_status", 1); - updateWrapper.set("end_time", new Date()); - updateWrapper.eq("id", statusInfo.getCurrTaskId()); - update(updateWrapper); - } - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); + closeTask(request, info.getId() + ""); } } + private void openTask(StartTrackRequest request, String robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("target_id", request.getTrack_name()); + + List routeInfos = routeInfoService.list(query); + if (CollectionUtil.isEmpty(routeInfos)) { + throw new ServiceException(500, "路线不存在,请及时更新"); + } + RouteInfo routeInfo = routeInfos.get(0); + + //开启寻源任务 + if (request.getIsTask() == 1) { + //添加任务记录 + TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotId); + //No.3 更新器人执行任务信息 + Long currRouteId = routeInfo.getId(); + Long currTaskId = taskInfo.getId(); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); + statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + //算法初始化标志创建 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); + } + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId, routeInfo.getId()); + + } + + /** + * 点位上传回调 + * + * @param dto 实体 + */ + @Override + public void pointCallBack(PoseMessageResponseDTO dto, String robotId) { + //判定任务是否已经完成初始化 + Long longId = Convert.toLong(robotId); + Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + + RobotInfo robotInfo = cacheService.getRobotInfo(longId); + if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { + log.error("no config 中子源阈值未配置"); + return; + } + //TO-DO 中子源计数率读取 + Integer initValue = cacheService.readTaskInit(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + + //No.1 任务初始化 + if (initValue != 1) { + //执行初始化操作 + if (cacheService.updateTaskInit(longId, 1)) { + PathInitDTO pathInitDTO = createInitDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + pathInitDTO.setCount("0"); + //执行1次算法 初始化操作 + algorithmService.pathPlanningInit(pathInitDTO); + } + } + + //No.2 任务执行中 + if (taskId != null) { + //算法调用获取热力图 + PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + //TO-DO 障碍物判定信息 + pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); + //计数率 + pathPlanDTO.setCount("0.05"); + log.debug("heat map -- robotId:{},taskId:{}",robotId,taskId); + algorithmService.pathPlanning(pathPlanDTO); + + //是否触发寻源操作 + BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); + if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { + log.debug("task planning-- robotId:{},taskId:{}",robotId,taskId); + } + + if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { + log.debug("task stop-- robotId:{},taskId:{}",robotId,taskId); + } + } + } + + private PathPlanDTO createPlanDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { + PathPlanDTO pathPlanDTO = new PathPlanDTO(); + pathPlanDTO.setX(pointDTO.getX().intValue() + ""); + pathPlanDTO.setY(pointDTO.getY().intValue() + ""); + pathPlanDTO.setXMax(gridNumber); + pathPlanDTO.setYMax(pathPlanDTO.getXMax()); + pathPlanDTO.setTaskId(taskId); + pathPlanDTO.setRobotId(robotId); + return pathPlanDTO; + } + + private PathInitDTO createInitDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { + PathInitDTO pathInitDTO = new PathInitDTO(); + pathInitDTO.setXMax(gridNumber); + pathInitDTO.setYMax(pathInitDTO.getXMax()); + pathInitDTO.setX(pointDTO.getX().intValue() + ""); + pathInitDTO.setY(pointDTO.getY().intValue() + ""); + pathInitDTO.setTaskId(taskId); + pathInitDTO.setRobotId(robotId); + return pathInitDTO; + } + + private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, String robotId) { + //No.2 新增任务信息 + TaskInfo taskInfo = new TaskInfo(); + String currDate = DateUtil.format(new Date(), "yyyyMMdd"); + Long maxNo = this.baseMapper.selectMaxNo(currDate + "%"); + if (new Long(0L).equals(maxNo)) { + maxNo = new Long(currDate + String.format("%07d", 1)); + } else { + maxNo = maxNo + 1; + } + taskInfo.setTaskNo(maxNo); + taskInfo.setCreateTime(new Date()); + //任务类型 中子源 + taskInfo.setTaskType(1); + taskInfo.setDiscernType(1); + taskInfo.setTaskName(routeInfo.getRouteName() + "巡线任务"); + //执行状态 未完成 + taskInfo.setTaskStatus(0); + taskInfo.setStartTime(new Date()); + taskInfo.setRouteId(routeInfo.getId()); + taskInfo.setRobotId(Convert.toLong(robotId)); + save(taskInfo); + return taskInfo; + } + + private void closeTask(StartTrackRequest request, String robotId) { + //关闭操作 + RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); + if (statusInfo.getCurrTaskId() != null) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("update_time", new Date()); + updateWrapper.set("task_status", 1); + updateWrapper.set("end_time", new Date()); + updateWrapper.eq("id", statusInfo.getCurrTaskId()); + update(updateWrapper); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + } + //清空任务缓存 + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + //清空当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + } @Override public List getTaskListByStatus(Integer status, Integer taskType, Integer discernType) { @@ -148,4 +260,5 @@ queryWrapper.eq(null != discernType, "discern_type", discernType); return this.list(queryWrapper); } + } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 985c7f9..40c885a 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 @@ -115,7 +115,9 @@ @ApiModelProperty(value = "告警阈值配置", dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; - + @ApiModelProperty(value = "告警阈值上限", dataType = "String") + @TableField("max_threshold") + private BigDecimal maxThreshold; @ApiModelProperty(value = "电压上限", dataType = "Integer") @TableField("voltage_max") private Integer voltageMax; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index a5f0b12..00e34b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -5,6 +5,7 @@ import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.model.RouteKeyPointInfo; +import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; @@ -14,6 +15,7 @@ import com.casic.missiles.modular.robot.service.IRouteKeyPointInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -35,6 +37,7 @@ * @param enums 指令集 * @return */ + @Transactional @Override public ResponseDataDTO senderCmd(StartTrackRequest request, InstructCodeEnums enums) { MessageRequestDTO messageDTO = new MessageRequestDTO(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..1bc34e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; @@ -16,6 +17,7 @@ private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { this.robotTrajectoryInfoService = robotTrajectoryInfoService; } 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 b570568..fe90f30 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 @@ -30,4 +30,13 @@ * @return */ GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + + /** + * 根据栅格获取栅格中心点位 + * @param pointDTO 栅格坐标 + * @param gridNum 栅格总数 + * @param gridSize 栅格顶点值 + * @return + */ + GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java new file mode 100644 index 0000000..936c9bd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.robot.service; + +import com.casic.missiles.modular.robot.model.RobotInfo; + +/** + * 机器人缓存服务 + */ +public interface IRobotCacheService { + /** + * 读取机器人当前任务ID + * + * @param robotId + * @return + */ + Long readTaskId(Long robotId); + + /** + * 读取机器人当前路线ID + * + * @param robotId + * @return + */ + Long readRouteId(Long robotId); + + /** + * 算法初始化状态读取 + * @param robotId 机器人ID + * @return 机器人状态 + */ + Integer readTaskInit(Long robotId); + + /** + * 更新机器人任务ID + * + * @param robotId 机器人ID + * @param taskId 任务ID + * @return + */ + boolean updateTaskId(Long robotId, Long taskId); + + /** + * 更新机器人任务初始化完成标志 + * @param robotId 机器人id + * @param val 值 + * @return + */ + boolean updateTaskInit(Long robotId,Integer val); + + RobotInfo getRobotInfo(Long robotId); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index 7b63157..c491462 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import java.util.List; @@ -34,10 +35,18 @@ /** * 根据状态和类型查询任务 + * * @param status * @param taskType * @param discernType * @return */ - List getTaskListByStatus(Integer status,Integer taskType,Integer discernType); + List getTaskListByStatus(Integer status, Integer taskType, Integer discernType); + + /** + * 点位接收信息回调 + * + * @param dto 实体 + */ + void pointCallBack(PoseMessageResponseDTO dto,String robotId); } 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 a4882c7..ccd3f90 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 @@ -125,6 +125,30 @@ } /** + * 根据栅格读取栅格中心点位信息 + * + * @param pointDTO 栅格信息 + * @param gridNum 栅格数 + * @param gridSize 栅格顶点值 + * @return + */ + public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + + 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))); + + return centerPoint; + } + + /** * 数值格式化 * * @param str diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java new file mode 100644 index 0000000..f0aef00 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.service.IRobotCacheService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Service; + +@Service +public class RobotCacheServiceImpl implements IRobotCacheService { + private final IRobotInfoService robotInfoService; + + public RobotCacheServiceImpl(IRobotInfoService robotInfoService) { + this.robotInfoService = robotInfoService; + } + + @Override + public synchronized boolean updateTaskId(Long robotId, Long taskId) { + //读取当前机器人任务信息 + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + if (currId == taskId) { + return false; + } else { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, taskId); + return true; + } + } + + /** + * 锁机制 更新初始化标志 + * + * @param robotId 机器人id + * @param val 值 + * @return + */ + @Override + public synchronized boolean updateTaskInit(Long robotId, Integer val) { + Integer currVal = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + if (currVal == 1) { + return false; + } else { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, val); + return true; + } + } + + @Override + public RobotInfo getRobotInfo(Long robotId) { + return robotInfoService.getById(robotId); + } + + @Override + public Long readTaskId(Long robotId) { + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + return currId; + } + + @Override + public Long readRouteId(Long robotId) { + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + return currId; + } + + @Override + public Integer readTaskInit(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + return currId; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index 33359e9..54c2c42 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -31,9 +32,11 @@ @Service public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; + private final ITaskInfoService infoService; - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { this.robotStatusInfoService = robotStatusInfoService; + this.infoService = infoService; } @Override @@ -62,6 +65,11 @@ info.setPostionZ(dto.getZ()); info.setTheta(dto.getTheta()); save(info); + try { + infoService.pointCallBack(dto, robotId); + } catch (Exception e) { + log.error("task error", e); + } } } } 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 c0fd233..f5fefc2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -1,8 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -10,20 +10,27 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; +import com.casic.missiles.modular.robot.dto.GridPointDTO; +import com.casic.missiles.modular.robot.dto.PathInitDTO; +import com.casic.missiles.modular.robot.dto.PathPlanDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import com.casic.missiles.modular.robot.service.*; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -36,6 +43,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Service public class TaskInfoServiceImpl extends ServiceImpl implements ITaskInfoService { private final IRouteInfoService routeInfoService; @@ -43,13 +51,17 @@ private final AbstractDictService dictService; private final IAlarmRecordService recordService; private final ITaskHeatMapService taskHeatMapService; + private final IAlgorithmService algorithmService; + private final IRobotCacheService cacheService; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; this.recordService = recordService; this.taskHeatMapService = taskHeatMapService; + this.algorithmService = algorithmService; + this.cacheService = cacheService; } @Override @@ -85,60 +97,160 @@ @Transactional @Override public void reloadTask(StartTrackRequest request, RobotInfo info) { - String robotId = info.getId() + ""; - //开启操作 if (request.getAction() == 1) { - QueryWrapper query = new QueryWrapper<>(); - query.eq("target_id", request.getTrack_name()); - List routeInfos = routeInfoService.list(query); - - if (CollectionUtil.isEmpty(routeInfos)) { - throw new ServiceException(500, "路线不存在,请及时更新"); - } - RouteInfo routeInfo = routeInfos.get(0); - //No.2 新增任务信息 - TaskInfo taskInfo = new TaskInfo(); - String currDate = DateUtil.format(new Date(), "yyyyMMdd"); - Long maxNo = this.baseMapper.selectMaxNo(currDate + "%"); - if (new Long(0L).equals(maxNo)) { - maxNo = new Long(currDate + String.format("%07d", 1)); - } else { - maxNo = maxNo + 1; - } - taskInfo.setTaskNo(maxNo); - taskInfo.setCreateTime(new Date()); - //任务类型 中子源 - taskInfo.setTaskType(1); - taskInfo.setDiscernType(1); - taskInfo.setTaskName(routeInfo.getRouteName() + "巡线任务"); - //执行状态 未完成 - taskInfo.setTaskStatus(0); - taskInfo.setStartTime(new Date()); - taskInfo.setRouteId(routeInfo.getId()); - taskInfo.setRobotId(info.getId()); - save(taskInfo); - - //No.3 更新 - Long currRouteId = routeInfo.getId(); - Long currTaskId = taskInfo.getId(); - statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + openTask(request, info.getId() + ""); } else { - //关闭操作 - RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); - if (statusInfo.getCurrTaskId() != null) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("update_time", new Date()); - updateWrapper.set("task_status", 1); - updateWrapper.set("end_time", new Date()); - updateWrapper.eq("id", statusInfo.getCurrTaskId()); - update(updateWrapper); - } - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); + closeTask(request, info.getId() + ""); } } + private void openTask(StartTrackRequest request, String robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("target_id", request.getTrack_name()); + + List routeInfos = routeInfoService.list(query); + if (CollectionUtil.isEmpty(routeInfos)) { + throw new ServiceException(500, "路线不存在,请及时更新"); + } + RouteInfo routeInfo = routeInfos.get(0); + + //开启寻源任务 + if (request.getIsTask() == 1) { + //添加任务记录 + TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotId); + //No.3 更新器人执行任务信息 + Long currRouteId = routeInfo.getId(); + Long currTaskId = taskInfo.getId(); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); + statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + //算法初始化标志创建 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); + } + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId, routeInfo.getId()); + + } + + /** + * 点位上传回调 + * + * @param dto 实体 + */ + @Override + public void pointCallBack(PoseMessageResponseDTO dto, String robotId) { + //判定任务是否已经完成初始化 + Long longId = Convert.toLong(robotId); + Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + + RobotInfo robotInfo = cacheService.getRobotInfo(longId); + if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { + log.error("no config 中子源阈值未配置"); + return; + } + //TO-DO 中子源计数率读取 + Integer initValue = cacheService.readTaskInit(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + + //No.1 任务初始化 + if (initValue != 1) { + //执行初始化操作 + if (cacheService.updateTaskInit(longId, 1)) { + PathInitDTO pathInitDTO = createInitDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + pathInitDTO.setCount("0"); + //执行1次算法 初始化操作 + algorithmService.pathPlanningInit(pathInitDTO); + } + } + + //No.2 任务执行中 + if (taskId != null) { + //算法调用获取热力图 + PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + //TO-DO 障碍物判定信息 + pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); + //计数率 + pathPlanDTO.setCount("0.05"); + log.debug("heat map -- robotId:{},taskId:{}",robotId,taskId); + algorithmService.pathPlanning(pathPlanDTO); + + //是否触发寻源操作 + BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); + if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { + log.debug("task planning-- robotId:{},taskId:{}",robotId,taskId); + } + + if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { + log.debug("task stop-- robotId:{},taskId:{}",robotId,taskId); + } + } + } + + private PathPlanDTO createPlanDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { + PathPlanDTO pathPlanDTO = new PathPlanDTO(); + pathPlanDTO.setX(pointDTO.getX().intValue() + ""); + pathPlanDTO.setY(pointDTO.getY().intValue() + ""); + pathPlanDTO.setXMax(gridNumber); + pathPlanDTO.setYMax(pathPlanDTO.getXMax()); + pathPlanDTO.setTaskId(taskId); + pathPlanDTO.setRobotId(robotId); + return pathPlanDTO; + } + + private PathInitDTO createInitDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { + PathInitDTO pathInitDTO = new PathInitDTO(); + pathInitDTO.setXMax(gridNumber); + pathInitDTO.setYMax(pathInitDTO.getXMax()); + pathInitDTO.setX(pointDTO.getX().intValue() + ""); + pathInitDTO.setY(pointDTO.getY().intValue() + ""); + pathInitDTO.setTaskId(taskId); + pathInitDTO.setRobotId(robotId); + return pathInitDTO; + } + + private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, String robotId) { + //No.2 新增任务信息 + TaskInfo taskInfo = new TaskInfo(); + String currDate = DateUtil.format(new Date(), "yyyyMMdd"); + Long maxNo = this.baseMapper.selectMaxNo(currDate + "%"); + if (new Long(0L).equals(maxNo)) { + maxNo = new Long(currDate + String.format("%07d", 1)); + } else { + maxNo = maxNo + 1; + } + taskInfo.setTaskNo(maxNo); + taskInfo.setCreateTime(new Date()); + //任务类型 中子源 + taskInfo.setTaskType(1); + taskInfo.setDiscernType(1); + taskInfo.setTaskName(routeInfo.getRouteName() + "巡线任务"); + //执行状态 未完成 + taskInfo.setTaskStatus(0); + taskInfo.setStartTime(new Date()); + taskInfo.setRouteId(routeInfo.getId()); + taskInfo.setRobotId(Convert.toLong(robotId)); + save(taskInfo); + return taskInfo; + } + + private void closeTask(StartTrackRequest request, String robotId) { + //关闭操作 + RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); + if (statusInfo.getCurrTaskId() != null) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("update_time", new Date()); + updateWrapper.set("task_status", 1); + updateWrapper.set("end_time", new Date()); + updateWrapper.eq("id", statusInfo.getCurrTaskId()); + update(updateWrapper); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + } + //清空任务缓存 + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + //清空当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + } @Override public List getTaskListByStatus(Integer status, Integer taskType, Integer discernType) { @@ -148,4 +260,5 @@ queryWrapper.eq(null != discernType, "discern_type", discernType); return this.list(queryWrapper); } + } \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/config/RobotCacheConfig.java b/casic-web/src/main/java/com/casic/missiles/config/RobotCacheConfig.java new file mode 100644 index 0000000..2e6fb0a --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/config/RobotCacheConfig.java @@ -0,0 +1,33 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.casic.missiles.config; + +import net.sf.ehcache.config.CacheConfiguration; +import net.sf.ehcache.config.PersistenceConfiguration; +import net.sf.ehcache.config.PersistenceConfiguration.Strategy; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RobotCacheConfig { + public RobotCacheConfig() { + } + + @Bean + public CacheConfiguration robotEhcache() { + CacheConfiguration config = new CacheConfiguration(); + config.setName("CONSTANT_ROBOT"); + config.setMaxEntriesLocalHeap(25000L); + config.setEternal(true); + config.setClearOnFlush(false); + config.persistence((new PersistenceConfiguration()).strategy(Strategy.LOCALTEMPSWAP)).maxEntriesLocalDisk(0); + config.setMaxElementsOnDisk(100000); + config.setDiskExpiryThreadIntervalSeconds(120L); + config.setMemoryStoreEvictionPolicy("LFU"); + config.transactionalMode("off"); + return config; + } +} 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 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 985c7f9..40c885a 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 @@ -115,7 +115,9 @@ @ApiModelProperty(value = "告警阈值配置", dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; - + @ApiModelProperty(value = "告警阈值上限", dataType = "String") + @TableField("max_threshold") + private BigDecimal maxThreshold; @ApiModelProperty(value = "电压上限", dataType = "Integer") @TableField("voltage_max") private Integer voltageMax; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index a5f0b12..00e34b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -5,6 +5,7 @@ import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.model.RouteKeyPointInfo; +import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; @@ -14,6 +15,7 @@ import com.casic.missiles.modular.robot.service.IRouteKeyPointInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -35,6 +37,7 @@ * @param enums 指令集 * @return */ + @Transactional @Override public ResponseDataDTO senderCmd(StartTrackRequest request, InstructCodeEnums enums) { MessageRequestDTO messageDTO = new MessageRequestDTO(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..1bc34e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; @@ -16,6 +17,7 @@ private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { this.robotTrajectoryInfoService = robotTrajectoryInfoService; } 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 b570568..fe90f30 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 @@ -30,4 +30,13 @@ * @return */ GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + + /** + * 根据栅格获取栅格中心点位 + * @param pointDTO 栅格坐标 + * @param gridNum 栅格总数 + * @param gridSize 栅格顶点值 + * @return + */ + GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java new file mode 100644 index 0000000..936c9bd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.robot.service; + +import com.casic.missiles.modular.robot.model.RobotInfo; + +/** + * 机器人缓存服务 + */ +public interface IRobotCacheService { + /** + * 读取机器人当前任务ID + * + * @param robotId + * @return + */ + Long readTaskId(Long robotId); + + /** + * 读取机器人当前路线ID + * + * @param robotId + * @return + */ + Long readRouteId(Long robotId); + + /** + * 算法初始化状态读取 + * @param robotId 机器人ID + * @return 机器人状态 + */ + Integer readTaskInit(Long robotId); + + /** + * 更新机器人任务ID + * + * @param robotId 机器人ID + * @param taskId 任务ID + * @return + */ + boolean updateTaskId(Long robotId, Long taskId); + + /** + * 更新机器人任务初始化完成标志 + * @param robotId 机器人id + * @param val 值 + * @return + */ + boolean updateTaskInit(Long robotId,Integer val); + + RobotInfo getRobotInfo(Long robotId); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index 7b63157..c491462 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import java.util.List; @@ -34,10 +35,18 @@ /** * 根据状态和类型查询任务 + * * @param status * @param taskType * @param discernType * @return */ - List getTaskListByStatus(Integer status,Integer taskType,Integer discernType); + List getTaskListByStatus(Integer status, Integer taskType, Integer discernType); + + /** + * 点位接收信息回调 + * + * @param dto 实体 + */ + void pointCallBack(PoseMessageResponseDTO dto,String robotId); } 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 a4882c7..ccd3f90 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 @@ -125,6 +125,30 @@ } /** + * 根据栅格读取栅格中心点位信息 + * + * @param pointDTO 栅格信息 + * @param gridNum 栅格数 + * @param gridSize 栅格顶点值 + * @return + */ + public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + + 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))); + + return centerPoint; + } + + /** * 数值格式化 * * @param str diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java new file mode 100644 index 0000000..f0aef00 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.service.IRobotCacheService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Service; + +@Service +public class RobotCacheServiceImpl implements IRobotCacheService { + private final IRobotInfoService robotInfoService; + + public RobotCacheServiceImpl(IRobotInfoService robotInfoService) { + this.robotInfoService = robotInfoService; + } + + @Override + public synchronized boolean updateTaskId(Long robotId, Long taskId) { + //读取当前机器人任务信息 + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + if (currId == taskId) { + return false; + } else { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, taskId); + return true; + } + } + + /** + * 锁机制 更新初始化标志 + * + * @param robotId 机器人id + * @param val 值 + * @return + */ + @Override + public synchronized boolean updateTaskInit(Long robotId, Integer val) { + Integer currVal = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + if (currVal == 1) { + return false; + } else { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, val); + return true; + } + } + + @Override + public RobotInfo getRobotInfo(Long robotId) { + return robotInfoService.getById(robotId); + } + + @Override + public Long readTaskId(Long robotId) { + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + return currId; + } + + @Override + public Long readRouteId(Long robotId) { + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + return currId; + } + + @Override + public Integer readTaskInit(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + return currId; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index 33359e9..54c2c42 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -31,9 +32,11 @@ @Service public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; + private final ITaskInfoService infoService; - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { this.robotStatusInfoService = robotStatusInfoService; + this.infoService = infoService; } @Override @@ -62,6 +65,11 @@ info.setPostionZ(dto.getZ()); info.setTheta(dto.getTheta()); save(info); + try { + infoService.pointCallBack(dto, robotId); + } catch (Exception e) { + log.error("task error", e); + } } } } 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 c0fd233..f5fefc2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -1,8 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -10,20 +10,27 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; +import com.casic.missiles.modular.robot.dto.GridPointDTO; +import com.casic.missiles.modular.robot.dto.PathInitDTO; +import com.casic.missiles.modular.robot.dto.PathPlanDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import com.casic.missiles.modular.robot.service.*; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -36,6 +43,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Service public class TaskInfoServiceImpl extends ServiceImpl implements ITaskInfoService { private final IRouteInfoService routeInfoService; @@ -43,13 +51,17 @@ private final AbstractDictService dictService; private final IAlarmRecordService recordService; private final ITaskHeatMapService taskHeatMapService; + private final IAlgorithmService algorithmService; + private final IRobotCacheService cacheService; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; this.recordService = recordService; this.taskHeatMapService = taskHeatMapService; + this.algorithmService = algorithmService; + this.cacheService = cacheService; } @Override @@ -85,60 +97,160 @@ @Transactional @Override public void reloadTask(StartTrackRequest request, RobotInfo info) { - String robotId = info.getId() + ""; - //开启操作 if (request.getAction() == 1) { - QueryWrapper query = new QueryWrapper<>(); - query.eq("target_id", request.getTrack_name()); - List routeInfos = routeInfoService.list(query); - - if (CollectionUtil.isEmpty(routeInfos)) { - throw new ServiceException(500, "路线不存在,请及时更新"); - } - RouteInfo routeInfo = routeInfos.get(0); - //No.2 新增任务信息 - TaskInfo taskInfo = new TaskInfo(); - String currDate = DateUtil.format(new Date(), "yyyyMMdd"); - Long maxNo = this.baseMapper.selectMaxNo(currDate + "%"); - if (new Long(0L).equals(maxNo)) { - maxNo = new Long(currDate + String.format("%07d", 1)); - } else { - maxNo = maxNo + 1; - } - taskInfo.setTaskNo(maxNo); - taskInfo.setCreateTime(new Date()); - //任务类型 中子源 - taskInfo.setTaskType(1); - taskInfo.setDiscernType(1); - taskInfo.setTaskName(routeInfo.getRouteName() + "巡线任务"); - //执行状态 未完成 - taskInfo.setTaskStatus(0); - taskInfo.setStartTime(new Date()); - taskInfo.setRouteId(routeInfo.getId()); - taskInfo.setRobotId(info.getId()); - save(taskInfo); - - //No.3 更新 - Long currRouteId = routeInfo.getId(); - Long currTaskId = taskInfo.getId(); - statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + openTask(request, info.getId() + ""); } else { - //关闭操作 - RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); - if (statusInfo.getCurrTaskId() != null) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("update_time", new Date()); - updateWrapper.set("task_status", 1); - updateWrapper.set("end_time", new Date()); - updateWrapper.eq("id", statusInfo.getCurrTaskId()); - update(updateWrapper); - } - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); + closeTask(request, info.getId() + ""); } } + private void openTask(StartTrackRequest request, String robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("target_id", request.getTrack_name()); + + List routeInfos = routeInfoService.list(query); + if (CollectionUtil.isEmpty(routeInfos)) { + throw new ServiceException(500, "路线不存在,请及时更新"); + } + RouteInfo routeInfo = routeInfos.get(0); + + //开启寻源任务 + if (request.getIsTask() == 1) { + //添加任务记录 + TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotId); + //No.3 更新器人执行任务信息 + Long currRouteId = routeInfo.getId(); + Long currTaskId = taskInfo.getId(); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); + statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + //算法初始化标志创建 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); + } + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId, routeInfo.getId()); + + } + + /** + * 点位上传回调 + * + * @param dto 实体 + */ + @Override + public void pointCallBack(PoseMessageResponseDTO dto, String robotId) { + //判定任务是否已经完成初始化 + Long longId = Convert.toLong(robotId); + Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + + RobotInfo robotInfo = cacheService.getRobotInfo(longId); + if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { + log.error("no config 中子源阈值未配置"); + return; + } + //TO-DO 中子源计数率读取 + Integer initValue = cacheService.readTaskInit(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + + //No.1 任务初始化 + if (initValue != 1) { + //执行初始化操作 + if (cacheService.updateTaskInit(longId, 1)) { + PathInitDTO pathInitDTO = createInitDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + pathInitDTO.setCount("0"); + //执行1次算法 初始化操作 + algorithmService.pathPlanningInit(pathInitDTO); + } + } + + //No.2 任务执行中 + if (taskId != null) { + //算法调用获取热力图 + PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + //TO-DO 障碍物判定信息 + pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); + //计数率 + pathPlanDTO.setCount("0.05"); + log.debug("heat map -- robotId:{},taskId:{}",robotId,taskId); + algorithmService.pathPlanning(pathPlanDTO); + + //是否触发寻源操作 + BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); + if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { + log.debug("task planning-- robotId:{},taskId:{}",robotId,taskId); + } + + if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { + log.debug("task stop-- robotId:{},taskId:{}",robotId,taskId); + } + } + } + + private PathPlanDTO createPlanDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { + PathPlanDTO pathPlanDTO = new PathPlanDTO(); + pathPlanDTO.setX(pointDTO.getX().intValue() + ""); + pathPlanDTO.setY(pointDTO.getY().intValue() + ""); + pathPlanDTO.setXMax(gridNumber); + pathPlanDTO.setYMax(pathPlanDTO.getXMax()); + pathPlanDTO.setTaskId(taskId); + pathPlanDTO.setRobotId(robotId); + return pathPlanDTO; + } + + private PathInitDTO createInitDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { + PathInitDTO pathInitDTO = new PathInitDTO(); + pathInitDTO.setXMax(gridNumber); + pathInitDTO.setYMax(pathInitDTO.getXMax()); + pathInitDTO.setX(pointDTO.getX().intValue() + ""); + pathInitDTO.setY(pointDTO.getY().intValue() + ""); + pathInitDTO.setTaskId(taskId); + pathInitDTO.setRobotId(robotId); + return pathInitDTO; + } + + private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, String robotId) { + //No.2 新增任务信息 + TaskInfo taskInfo = new TaskInfo(); + String currDate = DateUtil.format(new Date(), "yyyyMMdd"); + Long maxNo = this.baseMapper.selectMaxNo(currDate + "%"); + if (new Long(0L).equals(maxNo)) { + maxNo = new Long(currDate + String.format("%07d", 1)); + } else { + maxNo = maxNo + 1; + } + taskInfo.setTaskNo(maxNo); + taskInfo.setCreateTime(new Date()); + //任务类型 中子源 + taskInfo.setTaskType(1); + taskInfo.setDiscernType(1); + taskInfo.setTaskName(routeInfo.getRouteName() + "巡线任务"); + //执行状态 未完成 + taskInfo.setTaskStatus(0); + taskInfo.setStartTime(new Date()); + taskInfo.setRouteId(routeInfo.getId()); + taskInfo.setRobotId(Convert.toLong(robotId)); + save(taskInfo); + return taskInfo; + } + + private void closeTask(StartTrackRequest request, String robotId) { + //关闭操作 + RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); + if (statusInfo.getCurrTaskId() != null) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("update_time", new Date()); + updateWrapper.set("task_status", 1); + updateWrapper.set("end_time", new Date()); + updateWrapper.eq("id", statusInfo.getCurrTaskId()); + update(updateWrapper); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + } + //清空任务缓存 + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + //清空当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + } @Override public List getTaskListByStatus(Integer status, Integer taskType, Integer discernType) { @@ -148,4 +260,5 @@ queryWrapper.eq(null != discernType, "discern_type", discernType); return this.list(queryWrapper); } + } \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/config/RobotCacheConfig.java b/casic-web/src/main/java/com/casic/missiles/config/RobotCacheConfig.java new file mode 100644 index 0000000..2e6fb0a --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/config/RobotCacheConfig.java @@ -0,0 +1,33 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.casic.missiles.config; + +import net.sf.ehcache.config.CacheConfiguration; +import net.sf.ehcache.config.PersistenceConfiguration; +import net.sf.ehcache.config.PersistenceConfiguration.Strategy; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RobotCacheConfig { + public RobotCacheConfig() { + } + + @Bean + public CacheConfiguration robotEhcache() { + CacheConfiguration config = new CacheConfiguration(); + config.setName("CONSTANT_ROBOT"); + config.setMaxEntriesLocalHeap(25000L); + config.setEternal(true); + config.setClearOnFlush(false); + config.persistence((new PersistenceConfiguration()).strategy(Strategy.LOCALTEMPSWAP)).maxEntriesLocalDisk(0); + config.setMaxElementsOnDisk(100000); + config.setDiskExpiryThreadIntervalSeconds(120L); + config.setMemoryStoreEvictionPolicy("LFU"); + config.transactionalMode("off"); + return config; + } +} diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 8fbd6db..db10efc 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -6,7 +6,7 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root - password: root + password: 123456 jms: pub-sub-domain: true # session: diff --git a/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java b/casic-server/src/main/java/com/casic/missiles/modular/constants/RobotDictConstants.java index 39a0a34..8adc664 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 @@ -10,4 +10,20 @@ */ String TASK_TYPE = "taskType"; String TASK_STATUS = "taskStatus"; + + /** + * 缓存schema定义 + */ + String CACHE_SCHEMA = "CONSTANT_ROBOT"; + + /** + * 当前路线ID + */ + String KEY_CUR_ROUTE_ID= "CUR_ROUTE_ID_"; + + /** + * 当前任务ID + */ + String KEY_CUR_TASK_ID = "CUR_TASK_ID_"; + String KEY_CUR_TASK_INIT = "CUR_TASK_INIT_"; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java index ab67fac..7f86cba 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/controller/RouteInfoController.java @@ -3,9 +3,12 @@ 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.cache.CacheUtil; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.dto.GridPointDTO; import com.casic.missiles.modular.robot.dto.PathInitDTO; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.service.IAlgorithmService; @@ -43,16 +46,20 @@ @ApiOperation(value = "测试", hidden = true) @GetMapping(value = "/test") public ResponseDataDTO> test(@RequestBody PathInitDTO pathInitDTO) { + Long tsk = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID); return ResponseDataDTO.success(algorithmService.pathPlanningInit(pathInitDTO)); } + /** * 线路信息管理(其他信息待定)列表 */ @ApiOperation(value = "栅格转换", hidden = true) @GetMapping(value = "/testGrid") public ResponseDataDTO> testGrid(@RequestBody PathInitDTO pathInitDTO) { - return ResponseDataDTO.success(algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4))); + GridPointDTO gridPointDTO = algorithmService.convertSlamToGrid(new BigDecimal(pathInitDTO.getX()),new BigDecimal(pathInitDTO.getY()),10,new BigDecimal(4)); + return ResponseDataDTO.success(algorithmService.getGridCenterPoint(gridPointDTO,10,new BigDecimal(4))); } + /** * 线路信息管理(其他信息待定)列表 */ 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 e9fb527..10f1069 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 @@ -6,6 +6,6 @@ @Data public class GridPointDTO { - BigDecimal x; - BigDecimal y; + private BigDecimal x; + private BigDecimal y; } 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 985c7f9..40c885a 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 @@ -115,7 +115,9 @@ @ApiModelProperty(value = "告警阈值配置", dataType = "String") @TableField("alarm_threshold") private BigDecimal alarmThreshold; - + @ApiModelProperty(value = "告警阈值上限", dataType = "String") + @TableField("max_threshold") + private BigDecimal maxThreshold; @ApiModelProperty(value = "电压上限", dataType = "Integer") @TableField("voltage_max") private Integer voltageMax; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java index a5f0b12..00e34b0 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/cmd/StartTrackCmdHandler.java @@ -5,6 +5,7 @@ import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.model.response.dto.ResponseDataDTO; import com.casic.missiles.modular.robot.model.RouteKeyPointInfo; +import com.casic.missiles.modular.robot.model.TaskInfo; import com.casic.missiles.modular.robot.opt.IRobotRouteOptService; import com.casic.missiles.modular.robot.opt.enums.InstructCodeEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractCmdHandler; @@ -14,6 +15,7 @@ import com.casic.missiles.modular.robot.service.IRouteKeyPointInfoService; import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -35,6 +37,7 @@ * @param enums 指令集 * @return */ + @Transactional @Override public ResponseDataDTO senderCmd(StartTrackRequest request, InstructCodeEnums enums) { MessageRequestDTO messageDTO = new MessageRequestDTO(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java index 1cf0e55..1bc34e1 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/opt/handler/msg/PoseMessageMsgHandler.java @@ -3,6 +3,7 @@ import com.casic.missiles.modular.robot.opt.enums.InstructStatusMsgEnums; import com.casic.missiles.modular.robot.opt.handler.AbstractSocketHandler; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import lombok.extern.slf4j.Slf4j; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.stereotype.Component; @@ -16,6 +17,7 @@ private final IRobotTrajectoryInfoService robotTrajectoryInfoService; + public PoseMessageMsgHandler(IRobotTrajectoryInfoService robotTrajectoryInfoService) { this.robotTrajectoryInfoService = robotTrajectoryInfoService; } 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 b570568..fe90f30 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 @@ -30,4 +30,13 @@ * @return */ GridPointDTO convertSlamToGrid(BigDecimal x, BigDecimal y, Integer gridNum, BigDecimal gridSize); + + /** + * 根据栅格获取栅格中心点位 + * @param pointDTO 栅格坐标 + * @param gridNum 栅格总数 + * @param gridSize 栅格顶点值 + * @return + */ + GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize); } \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java new file mode 100644 index 0000000..936c9bd --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/IRobotCacheService.java @@ -0,0 +1,50 @@ +package com.casic.missiles.modular.robot.service; + +import com.casic.missiles.modular.robot.model.RobotInfo; + +/** + * 机器人缓存服务 + */ +public interface IRobotCacheService { + /** + * 读取机器人当前任务ID + * + * @param robotId + * @return + */ + Long readTaskId(Long robotId); + + /** + * 读取机器人当前路线ID + * + * @param robotId + * @return + */ + Long readRouteId(Long robotId); + + /** + * 算法初始化状态读取 + * @param robotId 机器人ID + * @return 机器人状态 + */ + Integer readTaskInit(Long robotId); + + /** + * 更新机器人任务ID + * + * @param robotId 机器人ID + * @param taskId 任务ID + * @return + */ + boolean updateTaskId(Long robotId, Long taskId); + + /** + * 更新机器人任务初始化完成标志 + * @param robotId 机器人id + * @param val 值 + * @return + */ + boolean updateTaskInit(Long robotId,Integer val); + + RobotInfo getRobotInfo(Long robotId); +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java index 7b63157..c491462 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/ITaskInfoService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import java.util.List; @@ -34,10 +35,18 @@ /** * 根据状态和类型查询任务 + * * @param status * @param taskType * @param discernType * @return */ - List getTaskListByStatus(Integer status,Integer taskType,Integer discernType); + List getTaskListByStatus(Integer status, Integer taskType, Integer discernType); + + /** + * 点位接收信息回调 + * + * @param dto 实体 + */ + void pointCallBack(PoseMessageResponseDTO dto,String robotId); } 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 a4882c7..ccd3f90 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 @@ -125,6 +125,30 @@ } /** + * 根据栅格读取栅格中心点位信息 + * + * @param pointDTO 栅格信息 + * @param gridNum 栅格数 + * @param gridSize 栅格顶点值 + * @return + */ + public GridPointDTO getGridCenterPoint(GridPointDTO pointDTO, Integer gridNum, BigDecimal gridSize) { + + 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))); + + return centerPoint; + } + + /** * 数值格式化 * * @param str diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java new file mode 100644 index 0000000..f0aef00 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotCacheServiceImpl.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.robot.service.impl; + +import com.casic.missiles.core.cache.CacheUtil; +import com.casic.missiles.modular.constants.RobotDictConstants; +import com.casic.missiles.modular.robot.model.RobotInfo; +import com.casic.missiles.modular.robot.service.IRobotCacheService; +import com.casic.missiles.modular.robot.service.IRobotInfoService; +import org.springframework.stereotype.Service; + +@Service +public class RobotCacheServiceImpl implements IRobotCacheService { + private final IRobotInfoService robotInfoService; + + public RobotCacheServiceImpl(IRobotInfoService robotInfoService) { + this.robotInfoService = robotInfoService; + } + + @Override + public synchronized boolean updateTaskId(Long robotId, Long taskId) { + //读取当前机器人任务信息 + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + if (currId == taskId) { + return false; + } else { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, taskId); + return true; + } + } + + /** + * 锁机制 更新初始化标志 + * + * @param robotId 机器人id + * @param val 值 + * @return + */ + @Override + public synchronized boolean updateTaskInit(Long robotId, Integer val) { + Integer currVal = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + if (currVal == 1) { + return false; + } else { + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, val); + return true; + } + } + + @Override + public RobotInfo getRobotInfo(Long robotId) { + return robotInfoService.getById(robotId); + } + + @Override + public Long readTaskId(Long robotId) { + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + return currId; + } + + @Override + public Long readRouteId(Long robotId) { + Long currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + return currId; + } + + @Override + public Integer readTaskInit(Long robotId) { + Integer currId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + return currId; + } + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java index 33359e9..54c2c42 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/RobotTrajectoryInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.service.IRobotStatusInfoService; import com.casic.missiles.modular.robot.service.IRobotTrajectoryInfoService; +import com.casic.missiles.modular.robot.service.ITaskInfoService; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -31,9 +32,11 @@ @Service public class RobotTrajectoryInfoServiceImpl extends ServiceImpl implements IRobotTrajectoryInfoService { private final IRobotStatusInfoService robotStatusInfoService; + private final ITaskInfoService infoService; - public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService) { + public RobotTrajectoryInfoServiceImpl(@Lazy IRobotStatusInfoService robotStatusInfoService, ITaskInfoService infoService) { this.robotStatusInfoService = robotStatusInfoService; + this.infoService = infoService; } @Override @@ -62,6 +65,11 @@ info.setPostionZ(dto.getZ()); info.setTheta(dto.getTheta()); save(info); + try { + infoService.pointCallBack(dto, robotId); + } catch (Exception e) { + log.error("task error", e); + } } } } 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 c0fd233..f5fefc2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/robot/service/impl/TaskInfoServiceImpl.java @@ -1,8 +1,8 @@ package com.casic.missiles.modular.robot.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -10,20 +10,27 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; +import com.casic.missiles.core.cache.CacheUtil; import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.modular.constants.RobotDictConstants; import com.casic.missiles.modular.robot.dao.TaskInfoMapper; +import com.casic.missiles.modular.robot.dto.GridPointDTO; +import com.casic.missiles.modular.robot.dto.PathInitDTO; +import com.casic.missiles.modular.robot.dto.PathPlanDTO; import com.casic.missiles.modular.robot.model.RobotInfo; import com.casic.missiles.modular.robot.model.RobotStatusInfo; import com.casic.missiles.modular.robot.model.RouteInfo; import com.casic.missiles.modular.robot.model.TaskInfo; +import com.casic.missiles.modular.robot.opt.instruct.dto.PoseMessageResponseDTO; import com.casic.missiles.modular.robot.opt.instruct.dto.StartTrackRequest; import com.casic.missiles.modular.robot.service.*; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -36,6 +43,7 @@ * @author lwh * @date 2023-10-30 */ +@Slf4j @Service public class TaskInfoServiceImpl extends ServiceImpl implements ITaskInfoService { private final IRouteInfoService routeInfoService; @@ -43,13 +51,17 @@ private final AbstractDictService dictService; private final IAlarmRecordService recordService; private final ITaskHeatMapService taskHeatMapService; + private final IAlgorithmService algorithmService; + private final IRobotCacheService cacheService; - public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService) { + public TaskInfoServiceImpl(@Lazy IRouteInfoService routeInfoService, IRobotStatusInfoService statusInfoService, AbstractDictService dictService, @Lazy IAlarmRecordService recordService, @Lazy ITaskHeatMapService taskHeatMapService, IAlgorithmService algorithmService, IRobotCacheService cacheService) { this.routeInfoService = routeInfoService; this.statusInfoService = statusInfoService; this.dictService = dictService; this.recordService = recordService; this.taskHeatMapService = taskHeatMapService; + this.algorithmService = algorithmService; + this.cacheService = cacheService; } @Override @@ -85,60 +97,160 @@ @Transactional @Override public void reloadTask(StartTrackRequest request, RobotInfo info) { - String robotId = info.getId() + ""; - //开启操作 if (request.getAction() == 1) { - QueryWrapper query = new QueryWrapper<>(); - query.eq("target_id", request.getTrack_name()); - List routeInfos = routeInfoService.list(query); - - if (CollectionUtil.isEmpty(routeInfos)) { - throw new ServiceException(500, "路线不存在,请及时更新"); - } - RouteInfo routeInfo = routeInfos.get(0); - //No.2 新增任务信息 - TaskInfo taskInfo = new TaskInfo(); - String currDate = DateUtil.format(new Date(), "yyyyMMdd"); - Long maxNo = this.baseMapper.selectMaxNo(currDate + "%"); - if (new Long(0L).equals(maxNo)) { - maxNo = new Long(currDate + String.format("%07d", 1)); - } else { - maxNo = maxNo + 1; - } - taskInfo.setTaskNo(maxNo); - taskInfo.setCreateTime(new Date()); - //任务类型 中子源 - taskInfo.setTaskType(1); - taskInfo.setDiscernType(1); - taskInfo.setTaskName(routeInfo.getRouteName() + "巡线任务"); - //执行状态 未完成 - taskInfo.setTaskStatus(0); - taskInfo.setStartTime(new Date()); - taskInfo.setRouteId(routeInfo.getId()); - taskInfo.setRobotId(info.getId()); - save(taskInfo); - - //No.3 更新 - Long currRouteId = routeInfo.getId(); - Long currTaskId = taskInfo.getId(); - statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + openTask(request, info.getId() + ""); } else { - //关闭操作 - RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); - if (statusInfo.getCurrTaskId() != null) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("update_time", new Date()); - updateWrapper.set("task_status", 1); - updateWrapper.set("end_time", new Date()); - updateWrapper.eq("id", statusInfo.getCurrTaskId()); - update(updateWrapper); - } - //清空当前任务 - statusInfoService.updateCurrTask(robotId, null, null); + closeTask(request, info.getId() + ""); } } + private void openTask(StartTrackRequest request, String robotId) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("target_id", request.getTrack_name()); + + List routeInfos = routeInfoService.list(query); + if (CollectionUtil.isEmpty(routeInfos)) { + throw new ServiceException(500, "路线不存在,请及时更新"); + } + RouteInfo routeInfo = routeInfos.get(0); + + //开启寻源任务 + if (request.getIsTask() == 1) { + //添加任务记录 + TaskInfo taskInfo = addTaskByStartTrack(routeInfo, robotId); + //No.3 更新器人执行任务信息 + Long currRouteId = routeInfo.getId(); + Long currTaskId = taskInfo.getId(); + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId, currTaskId); + statusInfoService.updateCurrTask(robotId, currRouteId, currTaskId); + //算法初始化标志创建 + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId, 0); + } + CacheUtil.put(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId, routeInfo.getId()); + + } + + /** + * 点位上传回调 + * + * @param dto 实体 + */ + @Override + public void pointCallBack(PoseMessageResponseDTO dto, String robotId) { + //判定任务是否已经完成初始化 + Long longId = Convert.toLong(robotId); + Long taskId = CacheUtil.get(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + + RobotInfo robotInfo = cacheService.getRobotInfo(longId); + if (robotInfo.getAlarmThreshold() == null || robotInfo.getMaxThreshold() == null) { + log.error("no config 中子源阈值未配置"); + return; + } + //TO-DO 中子源计数率读取 + Integer initValue = cacheService.readTaskInit(longId); + //slam经纬度转栅格 + GridPointDTO pointDTO = algorithmService.convertSlamToGrid(dto.getX(), dto.getY(), robotInfo.getGridNumber(), robotInfo.getGridSize()); + + //No.1 任务初始化 + if (initValue != 1) { + //执行初始化操作 + if (cacheService.updateTaskInit(longId, 1)) { + PathInitDTO pathInitDTO = createInitDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + pathInitDTO.setCount("0"); + //执行1次算法 初始化操作 + algorithmService.pathPlanningInit(pathInitDTO); + } + } + + //No.2 任务执行中 + if (taskId != null) { + //算法调用获取热力图 + PathPlanDTO pathPlanDTO = createPlanDTO(robotInfo.getGridNumber() + "", pointDTO, taskId, robotId); + //TO-DO 障碍物判定信息 + pathPlanDTO.setOpen("1,1,1,1,1,1,1,1"); + //计数率 + pathPlanDTO.setCount("0.05"); + log.debug("heat map -- robotId:{},taskId:{}",robotId,taskId); + algorithmService.pathPlanning(pathPlanDTO); + + //是否触发寻源操作 + BigDecimal bigCount = new BigDecimal(pathPlanDTO.getCount()); + if (bigCount.compareTo(robotInfo.getAlarmThreshold()) >= 0) { + log.debug("task planning-- robotId:{},taskId:{}",robotId,taskId); + } + + if (bigCount.compareTo(robotInfo.getMaxThreshold()) > 0) { + log.debug("task stop-- robotId:{},taskId:{}",robotId,taskId); + } + } + } + + private PathPlanDTO createPlanDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { + PathPlanDTO pathPlanDTO = new PathPlanDTO(); + pathPlanDTO.setX(pointDTO.getX().intValue() + ""); + pathPlanDTO.setY(pointDTO.getY().intValue() + ""); + pathPlanDTO.setXMax(gridNumber); + pathPlanDTO.setYMax(pathPlanDTO.getXMax()); + pathPlanDTO.setTaskId(taskId); + pathPlanDTO.setRobotId(robotId); + return pathPlanDTO; + } + + private PathInitDTO createInitDTO(String gridNumber, GridPointDTO pointDTO, Long taskId, String robotId) { + PathInitDTO pathInitDTO = new PathInitDTO(); + pathInitDTO.setXMax(gridNumber); + pathInitDTO.setYMax(pathInitDTO.getXMax()); + pathInitDTO.setX(pointDTO.getX().intValue() + ""); + pathInitDTO.setY(pointDTO.getY().intValue() + ""); + pathInitDTO.setTaskId(taskId); + pathInitDTO.setRobotId(robotId); + return pathInitDTO; + } + + private TaskInfo addTaskByStartTrack(RouteInfo routeInfo, String robotId) { + //No.2 新增任务信息 + TaskInfo taskInfo = new TaskInfo(); + String currDate = DateUtil.format(new Date(), "yyyyMMdd"); + Long maxNo = this.baseMapper.selectMaxNo(currDate + "%"); + if (new Long(0L).equals(maxNo)) { + maxNo = new Long(currDate + String.format("%07d", 1)); + } else { + maxNo = maxNo + 1; + } + taskInfo.setTaskNo(maxNo); + taskInfo.setCreateTime(new Date()); + //任务类型 中子源 + taskInfo.setTaskType(1); + taskInfo.setDiscernType(1); + taskInfo.setTaskName(routeInfo.getRouteName() + "巡线任务"); + //执行状态 未完成 + taskInfo.setTaskStatus(0); + taskInfo.setStartTime(new Date()); + taskInfo.setRouteId(routeInfo.getId()); + taskInfo.setRobotId(Convert.toLong(robotId)); + save(taskInfo); + return taskInfo; + } + + private void closeTask(StartTrackRequest request, String robotId) { + //关闭操作 + RobotStatusInfo statusInfo = statusInfoService.getStatusByRobotId(robotId); + if (statusInfo.getCurrTaskId() != null) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("update_time", new Date()); + updateWrapper.set("task_status", 1); + updateWrapper.set("end_time", new Date()); + updateWrapper.eq("id", statusInfo.getCurrTaskId()); + update(updateWrapper); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_ID + robotId); + } + //清空任务缓存 + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_ROUTE_ID + robotId); + CacheUtil.remove(RobotDictConstants.CACHE_SCHEMA, RobotDictConstants.KEY_CUR_TASK_INIT + robotId); + //清空当前任务 + statusInfoService.updateCurrTask(robotId, null, null); + } @Override public List getTaskListByStatus(Integer status, Integer taskType, Integer discernType) { @@ -148,4 +260,5 @@ queryWrapper.eq(null != discernType, "discern_type", discernType); return this.list(queryWrapper); } + } \ No newline at end of file diff --git a/casic-web/src/main/java/com/casic/missiles/config/RobotCacheConfig.java b/casic-web/src/main/java/com/casic/missiles/config/RobotCacheConfig.java new file mode 100644 index 0000000..2e6fb0a --- /dev/null +++ b/casic-web/src/main/java/com/casic/missiles/config/RobotCacheConfig.java @@ -0,0 +1,33 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.casic.missiles.config; + +import net.sf.ehcache.config.CacheConfiguration; +import net.sf.ehcache.config.PersistenceConfiguration; +import net.sf.ehcache.config.PersistenceConfiguration.Strategy; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RobotCacheConfig { + public RobotCacheConfig() { + } + + @Bean + public CacheConfiguration robotEhcache() { + CacheConfiguration config = new CacheConfiguration(); + config.setName("CONSTANT_ROBOT"); + config.setMaxEntriesLocalHeap(25000L); + config.setEternal(true); + config.setClearOnFlush(false); + config.persistence((new PersistenceConfiguration()).strategy(Strategy.LOCALTEMPSWAP)).maxEntriesLocalDisk(0); + config.setMaxElementsOnDisk(100000); + config.setDiskExpiryThreadIntervalSeconds(120L); + config.setMemoryStoreEvictionPolicy("LFU"); + config.transactionalMode("off"); + return config; + } +} diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 8fbd6db..db10efc 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -6,7 +6,7 @@ driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/casic_robot_inspection?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root - password: root + password: 123456 jms: pub-sub-domain: true # session: diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index 0a3cc06..7d4b29f 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -37,8 +37,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