仿真同步数据

This commit is contained in:
cbs 2025-04-02 17:51:52 +08:00
parent 85439bb29b
commit 7a89732aa6
16 changed files with 196 additions and 5 deletions

View File

@ -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:

View File

@ -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,"路径规划上报实时路径");

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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();
}
}

View File

@ -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

View File

@ -107,4 +107,11 @@ public class PathPlanningController {
pathPlanningService.robotDimensions();
return success("同步完成");
}
@PostMapping("/robot/simulationRobotPoseRequest")
@Operation(summary = "发送车辆数据给--仿真")
public CommonResult<String> simulationRobotPoseRequest() {
pathPlanningService.simulationRobotPoseRequest();
return success("同步完成");
}
}

View File

@ -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;
}

View File

@ -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,"仿真初始化地图");
/**
* 类型
*/

View File

@ -219,7 +219,10 @@ public class DeviceInformationServiceImpl extends ServiceImpl<DeviceInformationM
editList.addAll(list.get(1));
}
if (isNotEmpty(list.get(2))) {
list.get(2).forEach(a -> a.setPositionMapItemId(null));
list.get(2).forEach( a -> {
a.setPositionMapItemId(null);
a.setPositionMapId(null);
});
editList.addAll(list.get(2));
}
if (isNotEmpty(editList)) {

View File

@ -44,4 +44,9 @@ public interface PathPlanningService {
* @param message
*/
void pathPlanningMovePose(String message);
/**
* 仿真点位信息
*/
void simulationRobotPoseRequest();
}

View File

@ -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<PositionMapDO> 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<RobotInformationDO> robots = robotInformationService.getAllRobot();
if (ObjectUtil.isEmpty(robots)) {
log.info("仿真环境没有机器人信息");
return;
}
List<PositionMapItemDO> itemDOList = new ArrayList<>();
List<PositionMapItemDO> items = positionMapItemService.getPositionMapItemByMapAndType(positionMap.getId(), PositionMapItemEnum.WAIT.getType());
if (ObjectUtil.isEmpty(items) || items.size() < robots.size()) {
List<PositionMapItemDO> itemPoses = positionMapItemService.getPositionMapItemByMapAndType(positionMap.getId(), PositionMapItemEnum.PATH.getType());
itemDOList.addAll(itemPoses);
} else {
itemDOList = items;
}
List<SimulationRobotPoseDTO> 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())

View File

@ -103,4 +103,12 @@ public interface PositionMapItemService extends IService<PositionMapItemDO> {
Object getAGVPointInformation(String macAddress);
void setMapItemIdle(Long id);
/**
* 查询地图对应的类型数据
* @param id 地图id
* @param type 类型
* @return
*/
List<PositionMapItemDO> getPositionMapItemByMapAndType(Long id, Integer type);
}

View File

@ -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<PositionMapItemMappe
positionMapItemMapper.updateById(item);
}
@Override
public List<PositionMapItemDO> getPositionMapItemByMapAndType(Long mapId, Integer type) {
return positionMapItemMapper.selectList(new LambdaQueryWrapperX<PositionMapItemDO>()
.eq(PositionMapItemDO::getPositionMapId, mapId)
.eq(PositionMapItemDO::getType, type));
}
}

View File

@ -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<PositionMapDO> {
* @param id
*/
void emergencyStopOrRecovery(Long id);
/**
* 获取所有地图
* @return
*/
List<PositionMapDO> getAllMap();
}

View File

@ -305,4 +305,9 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
}
@Override
public List<PositionMapDO> getAllMap() {
return positionMapMapper.selectList(new LambdaQueryWrapperX<PositionMapDO>().orderByDesc(PositionMapDO::getId));
}
}