diff --git a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/config/MqttFactory.java b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/config/MqttFactory.java index 5bb9754e0..554eaa591 100644 --- a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/config/MqttFactory.java +++ b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/config/MqttFactory.java @@ -153,6 +153,8 @@ public class MqttFactory { return BeanUtils.getBean(PathPlanningDistributionTaskServiceImpl.class); case PLANNING_DISTRIBUTION_FAIL: return BeanUtils.getBean(PathPlanningDistributionFailServiceImpl.class); + case PLANNING_SIMULATION_ROBOT_POSE_REQUEST: + return BeanUtils.getBean(PlanningSimulationRobotPoseRequestServiceImpl.class); case PLANNING_MOVE: return BeanUtils.getBean(PathPlanningMoveServiceImpl.class); case PLANNING_ROUTE_DISPLAY: diff --git a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/enums/DefineSubTopicEnum.java b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/enums/DefineSubTopicEnum.java index b3ac6ace6..e686b0cbe 100644 --- a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/enums/DefineSubTopicEnum.java +++ b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/enums/DefineSubTopicEnum.java @@ -25,6 +25,7 @@ public enum DefineSubTopicEnum { PLANNING_INIT_DATA("SYNCHRONOUS_ALL_MAP_REQUEST", 2,"路径规划需要初始数据上报"), PLANNING_DISTRIBUTION_TASK("TASK_ASSIGNMENT_FEEDBACK", 2,"路径规划任务分配上报"), PLANNING_DISTRIBUTION_FAIL("TASK_ASSIGNMENT_FAIL", 2,"路径规划失败上报"), + PLANNING_SIMULATION_ROBOT_POSE_REQUEST("SIMULATION_ROBOT_POSE_REQUEST", 2,"仿真初始化点位信息"), PLANNING_MOVE("UPDATE_ROUTE_DISPLAY_PLANNING", 2,"车辆即将走的点位"), PLANNING_ROUTE_DISPLAY("ROBOT_MOVE_POSE_PLANNING", 2,"路径规划上报实时路径"); diff --git a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/PlanningSimulationRobotPoseRequestServiceImpl.java b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/PlanningSimulationRobotPoseRequestServiceImpl.java new file mode 100644 index 000000000..2d674ed46 --- /dev/null +++ b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/PlanningSimulationRobotPoseRequestServiceImpl.java @@ -0,0 +1,22 @@ +package cn.iododer.yudao.module.mqtt.service; + +import cn.iocoder.yudao.module.system.api.path.PathApi; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +@Slf4j +public class PlanningSimulationRobotPoseRequestServiceImpl implements MqttService{ + + @Resource + private PathApi pathApi; + + @Override + public void analysisMessage(String message) { + log.info("收到仿真初始化点位的消息 :{}",message); + pathApi.simulationRobotPoseRequest(message); + } + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApi.java index ee790e543..02f84fbdf 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApi.java @@ -32,4 +32,8 @@ public interface PathApi { @PostMapping(PREFIX + "/pathPlanningMovePose") @Operation(summary = "路径规划要走的点位信息") void pathPlanningMovePose(@RequestParam("message") String message); + + @PostMapping(PREFIX + "/simulationRobotPose") + @Operation(summary = "仿真初始化点位信息") + void simulationRobotPoseRequest(@RequestParam("message") String message); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApiImpl.java index 3798f5154..d3d4f8047 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApiImpl.java @@ -104,5 +104,15 @@ public class PathApiImpl implements PathApi { pathPlanningService.pathPlanningMovePose(message); } + /** + * 仿真点位信息 + * @param message + */ + @Override + public void simulationRobotPoseRequest(String message) { + TenantContextHolder.setTenantId(1L); + pathPlanningService.simulationRobotPoseRequest(); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/path/PathPlanningTopicConstant.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/path/PathPlanningTopicConstant.java index 38fb6a4cf..bb981dd42 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/path/PathPlanningTopicConstant.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/path/PathPlanningTopicConstant.java @@ -64,6 +64,10 @@ public class PathPlanningTopicConstant { * 发送车辆编号对应的车宽、中心与车头距离、中心与车尾距离给PP */ public static String SEND_ROBOT_DIMENSIONS = "SEND_ROBOT_DIMENSIONS"; + /** + * 仿真车辆信息 + */ + public static String INIT_ROBOT_POSE = "INIT_ROBOT_POSE"; /** * 车辆当前位置给给PP diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/path/PathPlanningController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/path/PathPlanningController.java index c8b8d30fc..bb5279343 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/path/PathPlanningController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/path/PathPlanningController.java @@ -107,4 +107,11 @@ public class PathPlanningController { pathPlanningService.robotDimensions(); return success("同步完成"); } + + @PostMapping("/robot/simulationRobotPoseRequest") + @Operation(summary = "发送车辆数据给--仿真") + public CommonResult simulationRobotPoseRequest() { + pathPlanningService.simulationRobotPoseRequest(); + return success("同步完成"); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/path/dto/SimulationRobotPoseDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/path/dto/SimulationRobotPoseDTO.java new file mode 100644 index 000000000..13fec9923 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/path/dto/SimulationRobotPoseDTO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.system.controller.admin.path.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +@Data +public class SimulationRobotPoseDTO { + private String mac; + + @Schema(description = "坐标x轴") + private String locationX; + + @Schema(description = "坐标y轴") + private String locationY; + + @Schema(description = "实际坐标x轴") + private String actualLocationX; + + @Schema(description = "实际坐标y轴") + private String actualLocationY; + + @Schema(description = "地图所在楼") + public String floor; + + @Schema(description = "地图所在区") + public String area; + + @Schema(description = "弧度") + private String locationYaw; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/config/CommandConfigTypeEnum.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/config/CommandConfigTypeEnum.java index f4f019258..3e4b30ffb 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/config/CommandConfigTypeEnum.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/config/CommandConfigTypeEnum.java @@ -13,7 +13,8 @@ public enum CommandConfigTypeEnum { CHARG_CONFIG(1,"充电设置(页面)"), PP_CONFIG_PRIORITY(2,"优先级>时间>路径"), PP_CONFIG_TIME(3,"优先级=时间>路径"), - PP_CONFIG_PATH(4,"优先级=时间=路径"); + PP_CONFIG_PATH(4,"优先级=时间=路径"), + SIMULATION_CONFIG(13,"仿真初始化地图"); /** * 类型 */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationServiceImpl.java index 8c664caff..37d8a4ee3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/information/DeviceInformationServiceImpl.java @@ -219,7 +219,10 @@ public class DeviceInformationServiceImpl extends ServiceImpl a.setPositionMapItemId(null)); + list.get(2).forEach( a -> { + a.setPositionMapItemId(null); + a.setPositionMapId(null); + }); editList.addAll(list.get(2)); } if (isNotEmpty(editList)) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningService.java index 6f32a49f1..816e0acb0 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningService.java @@ -44,4 +44,9 @@ public interface PathPlanningService { * @param message */ void pathPlanningMovePose(String message); + + /** + * 仿真点位信息 + */ + void simulationRobotPoseRequest(); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningServiceImpl.java index 6d5ae9bd1..bbbb2d17f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningServiceImpl.java @@ -18,19 +18,27 @@ import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant; import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant; import cn.iocoder.yudao.module.system.constant.robot.RobotTopicConstant; import cn.iocoder.yudao.module.system.constant.webSocket.WebSocketConstant; +import cn.iocoder.yudao.module.system.controller.admin.path.dto.SimulationRobotPoseDTO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapLineSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.robot.task.TaskAssignDTO; +import cn.iocoder.yudao.module.system.dal.dataobject.config.CommonConfigDO; import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO; import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO; import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapLineDO; +import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapItemMapper; import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapLineMapper; import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotInformationMapper; +import cn.iocoder.yudao.module.system.enums.config.CommandConfigTypeEnum; +import cn.iocoder.yudao.module.system.enums.item.PositionMapItemEnum; import cn.iocoder.yudao.module.system.enums.line.DirectionEnum; import cn.iocoder.yudao.module.system.enums.path.PathTypeEnum; +import cn.iocoder.yudao.module.system.service.config.CommonConfigService; +import cn.iocoder.yudao.module.system.service.positionmap.PositionMapItemService; +import cn.iocoder.yudao.module.system.service.positionmap.PositionMapService; import cn.iocoder.yudao.module.system.service.robot.RobotInformationService; import cn.iocoder.yudao.module.system.util.redis.RedisUtil; import com.alibaba.fastjson.JSON; @@ -80,15 +88,21 @@ public class PathPlanningServiceImpl implements PathPlanningService { @Resource private CommonApi commonApi; - @Resource - private RequestProcessor processor; - @Resource private RedisUtil redisUtil; @Resource public WebSocketSenderApi webSocketSenderApi; + @Resource + private CommonConfigService configService; + + @Resource + private PositionMapService positionMapService; + + @Resource + private PositionMapItemService positionMapItemService; + /** * 同步ware_position_map_line的点位信息 */ @@ -444,6 +458,64 @@ public class PathPlanningServiceImpl implements PathPlanningService { WebSocketConstant.PLANNING_MOVE_POSE, message); } + /** + * 仿真点位信息 + */ + @Override + public void simulationRobotPoseRequest() { + CommonConfigDO config = configService.getConfig(CommandConfigTypeEnum.SIMULATION_CONFIG.getType().longValue()); + PositionMapDO positionMap = null; + if (ObjectUtil.isEmpty(config) || ObjectUtil.isEmpty(config.getConfigStr())) { + List maps = positionMapService.getAllMap(); + if (ObjectUtil.isEmpty(maps)) { + return; + } + positionMap = maps.get(0); + }else { + positionMap = positionMapService.getPositionMap(Long.valueOf(config.getConfigStr())); + } + if (ObjectUtil.isEmpty(positionMap)) { + log.info("仿真环境没有地图信息"); + return; + } + + List robots = robotInformationService.getAllRobot(); + + if (ObjectUtil.isEmpty(robots)) { + log.info("仿真环境没有机器人信息"); + return; + } + + List itemDOList = new ArrayList<>(); + List items = positionMapItemService.getPositionMapItemByMapAndType(positionMap.getId(), PositionMapItemEnum.WAIT.getType()); + if (ObjectUtil.isEmpty(items) || items.size() < robots.size()) { + List itemPoses = positionMapItemService.getPositionMapItemByMapAndType(positionMap.getId(), PositionMapItemEnum.PATH.getType()); + itemDOList.addAll(itemPoses); + } else { + itemDOList = items; + } + + List simulationList = new ArrayList<>(); + int i = 0; + for (RobotInformationDO robot : robots) { + SimulationRobotPoseDTO simulationRobotPoseDTO = new SimulationRobotPoseDTO(); + simulationRobotPoseDTO.setMac(robot.getMacAddress()); + if (itemDOList.size() <= i) { + continue; + } + simulationRobotPoseDTO.setLocationX(itemDOList.get(i).getLocationX()); + simulationRobotPoseDTO.setLocationY(itemDOList.get(i).getLocationY()); + simulationRobotPoseDTO.setActualLocationX(itemDOList.get(i).getActualLocationX()); + simulationRobotPoseDTO.setActualLocationY(itemDOList.get(i).getActualLocationY()); + simulationRobotPoseDTO.setLocationYaw(itemDOList.get(i).getLocationYaw()); + simulationRobotPoseDTO.setFloor(positionMap.getFloor()+""); + simulationRobotPoseDTO.setArea(positionMap.getArea()); + simulationList.add(simulationRobotPoseDTO); + i++; + } + commonApi.commonMethod(simulationList, PathPlanningTopicConstant.INIT_ROBOT_POSE); + } + public PositionMapLineDTO setPositionMapLineDTOData(PositionMapLineDTO positionMapLineDO) { PositionMapLineDTO build = PositionMapLineDTO.builder() .id(positionMapLineDO.getId()) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapItemService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapItemService.java index 39eea5a0b..511cf09b6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapItemService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapItemService.java @@ -103,4 +103,12 @@ public interface PositionMapItemService extends IService { Object getAGVPointInformation(String macAddress); void setMapItemIdle(Long id); + + /** + * 查询地图对应的类型数据 + * @param id 地图id + * @param type 类型 + * @return + */ + List getPositionMapItemByMapAndType(Long id, Integer type); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapItemServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapItemServiceImpl.java index f02673147..ed4540cde 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapItemServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapItemServiceImpl.java @@ -17,6 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.Collections; import java.util.List; import static cn.hutool.core.collection.CollUtil.isNotEmpty; @@ -130,4 +131,11 @@ public class PositionMapItemServiceImpl extends ServiceImpl getPositionMapItemByMapAndType(Long mapId, Integer type) { + return positionMapItemMapper.selectList(new LambdaQueryWrapperX() + .eq(PositionMapItemDO::getPositionMapId, mapId) + .eq(PositionMapItemDO::getType, type)); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapService.java index d9e78b845..cc878ee5e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapService.java @@ -10,6 +10,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; +import java.util.List; /** * 仓库点位地图 Service 接口 @@ -94,4 +95,10 @@ public interface PositionMapService extends IService { * @param id */ void emergencyStopOrRecovery(Long id); + + /** + * 获取所有地图 + * @return + */ + List getAllMap(); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapServiceImpl.java index 35f4b98cf..e11f3ee52 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapServiceImpl.java @@ -305,4 +305,9 @@ public class PositionMapServiceImpl extends ServiceImpl getAllMap() { + return positionMapMapper.selectList(new LambdaQueryWrapperX().orderByDesc(PositionMapDO::getId)); + } + }