This commit is contained in:
cbs 2025-05-27 09:45:52 +08:00
parent 81423a8ad3
commit 26fa0dfb97
21 changed files with 129 additions and 12 deletions

View File

@ -15,7 +15,7 @@ import java.util.List;
public class PositionMapItemSynDTO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "31007")
private Long id;
private String id;
@Schema(description = "坐标x轴")
private Double x;

View File

@ -5,8 +5,10 @@ import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.mqtt.api.common.CommonApi;
import cn.iocoder.yudao.module.system.api.robot.dto.*;
import cn.iocoder.yudao.module.system.api.robot.processor.RequestProcessor;
import cn.iocoder.yudao.module.system.api.robot.vo.RobotInformationVO;
import cn.iocoder.yudao.module.system.config.ratelimiter.SystemRateLimiter;
import cn.iocoder.yudao.module.system.constant.area.FloorAreaConstant;
import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant;
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
@ -20,6 +22,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@ -52,13 +55,14 @@ public class RobotStatusApiImpl implements RobotStatusApi {
* @return
*/
@Override
@SystemRateLimiter(time = 1, count = 150, keyArg = "robotStatusUpdate",message = "机器人上报点位超过限流")
@SystemRateLimiter(time = 1, count = 150, keyArg = "robotStatusUpdate", message = "机器人上报点位超过限流")
public void robotStatusUpdate(RobotPoseStatusDTO robotStatusDataDTO) {
updateRobotPosed(robotStatusDataDTO);
}
/**
* 更新点位信息
*
* @param robotStatusDataDTO
*/
private void updateRobotPosed(RobotPoseStatusDTO robotStatusDataDTO) {
@ -99,6 +103,11 @@ public class RobotStatusApiImpl implements RobotStatusApi {
}
robotInformationVO.setPose2d(robotStatusDataPoseDTO);
Map<String, Object> map = new HashMap<>();
String value = FloorAreaConstant.FLOOR_AREA_ROBOT + floorZoneDTO.getFloor() + "-" + floorZoneDTO.getArea();
map.put(robotNo, robotInformationVO);
redisUtil.hmset(value, map, 20);
// 合并请求 - 这里接受到的数据都丢给 RequestProcessor - 再整合数据通过WebSocket丢给前端
processor.handleRequest(floorZoneDTO.getFloor() + "_" + floorZoneDTO.getArea(),
robotStatusDataDTO.getMac(), JSONUtil.toJsonStr(robotInformationVO));
@ -106,7 +115,7 @@ public class RobotStatusApiImpl implements RobotStatusApi {
}
private void sendToPP(RobotStatusDataPoseDTO robotStatusDataPoseDTO) {
taskExecutor.execute(()->{
taskExecutor.execute(() -> {
commonApi.commonMethod(robotStatusDataPoseDTO, PathPlanningTopicConstant.AGV_POSE);
});
}

View File

@ -1,8 +1,7 @@
package cn.iocoder.yudao.module.system.api.robot;
package cn.iocoder.yudao.module.system.api.robot.processor;
import cn.hutool.core.map.MapUtil;
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@ -46,7 +45,7 @@ public class RequestProcessor {
private void sendData(String map, Map<String, String> data) {
// -- 发送给对应的websocket
// System.out.println("key:" + map + "发送数据:" + data);
log.info("key:" + map + "发送数据:" + data);
// log.info("key:" + map + "发送数据:" + data);
webSocketSenderApi.sendObject(map, "map_push", data);
}

View File

@ -0,0 +1,59 @@
/*
package cn.iocoder.yudao.module.system.api.robot.processor;
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
import cn.iocoder.yudao.module.system.constant.area.FloorAreaConstant;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO;
import cn.iocoder.yudao.module.system.service.positionmap.PositionMapService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
*/
/**
* 3D推送车辆信息
*//*
@Component
@Slf4j
public class ThreeDRequestProcessor {
private final ConcurrentHashMap<String, ConcurrentHashMap<String, String>> cache = new ConcurrentHashMap<>();
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
@Resource
private PositionMapService positionMapService;
@Resource
private RedisUtil redisUtil;
@Resource
public WebSocketSenderApi webSocketSenderApi;
public ThreeDRequestProcessor() {
// 每秒执行一次 - 处理并发送数据 - 避免数据丢失
scheduler.scheduleAtFixedRate(this::processAndSend, 300, 300, TimeUnit.MILLISECONDS);
}
private void processAndSend() {
List<PositionMapDO> allMap = positionMapService.getAllMap();
for (PositionMapDO map : allMap) {
String key = FloorAreaConstant.FLOOR_AREA_ROBOT + map.getFloor() + "-" + map.getArea();
Map<Object, Object> data = redisUtil.hmget(key);
System.out.println("3D发送数据 "+ JSON.toJSONString(data));
webSocketSenderApi.sendObject(key, "3d_map_robot", data);
}
}
}
*/

View File

@ -0,0 +1,12 @@
package cn.iocoder.yudao.module.system.constant.area;
public class FloorAreaConstant {
//楼层区域的KEY通过这个KEY可以查这个楼层下所有的机器人
//仅限给WEBSOCKET推送给前端使用缓存15秒
public static String FLOOR_AREA_ROBOT = "floor:area:robot";
}

View File

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.camera;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -13,6 +15,7 @@ import com.alibaba.excel.annotation.*;
public class RobotCameraRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30856")
@JsonSerialize(using = ToStringSerializer.class)
@ExcelProperty("主键ID")
private Long id;

View File

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.chargelog;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -14,6 +16,7 @@ public class RobotChargeLogRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "6554")
@ExcelProperty("主键ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@Schema(description = "AGV编号")

View File

@ -1,6 +1,8 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.detail;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@ -9,6 +11,7 @@ import java.time.LocalDateTime;
@Data
public class RobotTaskDetailLogResoVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26224")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@Schema(description = "任务号")

View File

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.mapstop;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -14,6 +16,7 @@ public class RobotMapStopRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1220")
@ExcelProperty("主键ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@Schema(description = "急停仓库点位地图表id", example = "20550")

View File

@ -2,10 +2,11 @@ package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Set;
@ -14,6 +15,7 @@ import java.util.Set;
@ExcelIgnoreUnannotated
public class RobotInformationPageRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21881")
@JsonSerialize(using = ToStringSerializer.class)
@ExcelProperty("主键ID")
private Long id;

View File

@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
import cn.iocoder.yudao.module.system.controller.admin.robot.camera.RobotCameraAddVO;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;
@ -17,6 +19,7 @@ public class RobotInformationRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21881")
@ExcelProperty("主键ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@Schema(description = "车辆类型表id", example = "28234")

View File

@ -1,6 +1,8 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import cn.iocoder.yudao.module.system.controller.admin.robot.camera.RobotCameraAddVO;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
@ -16,6 +18,7 @@ import java.util.Set;
public class RobotInformationSaveReqVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21881")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@Schema(description = "车辆类型表id", example = "28234")

View File

@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@ -14,6 +16,7 @@ public class RobotModelRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15571")
@ExcelProperty("主键ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@Schema(description = "车辆类型", requiredMode = Schema.RequiredMode.REQUIRED)

View File

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -14,6 +16,7 @@ public class RobotTaskAutoMoveRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30110")
@ExcelProperty("主键ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@Schema(description = "机器人任务主表id", example = "24553")

View File

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@ -13,6 +15,7 @@ public class RobotTaskDetailRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26224")
@ExcelProperty("主键ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@Schema(description = "机器人任务主表id", requiredMode = Schema.RequiredMode.REQUIRED, example = "9241")

View File

@ -1,6 +1,8 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -17,6 +19,7 @@ public class RobotTaskRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15306")
@ExcelProperty("主键ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@Schema(description = "是否拼接任务0不拼接、1拼接", requiredMode = Schema.RequiredMode.REQUIRED)

View File

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -14,6 +16,7 @@ public class RobotWarnCodeMappingRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15754")
@ExcelProperty("主键ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@Schema(description = "告警等级 (1,2,3,4)")

View File

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.system.controller.admin.robot.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -14,6 +16,7 @@ public class RobotWarnMsgRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26180")
@ExcelProperty("主键ID")
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@Schema(description = "AGV编号")

View File

@ -185,7 +185,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
relatedPathNode.setType(PathTypeEnum.INIT.getType());
relatedPathNode.setControl_nodes(positionMapItemSynDTOS);
log.info("synchronousAllItem----doing");
log.info("synchronousAllItem----doing :{}",JSON.toJSONString(relatedPathNode));
commonApi.commonMethod(relatedPathNode, PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_NODE);
}
@ -347,7 +347,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
.y(Double.valueOf(positionMapItemDO.getActualLocationY()))
.sortNum(positionMapItemDO.getSortNum())
.yaw(Double.parseDouble(positionMapItemDO.getLocationYaw()))
.id(positionMapItemDO.getId()).build();
.id(positionMapItemDO.getId()+"").build();
PositionMapItemPathDTO PositionMapItemPathDTO = new PositionMapItemPathDTO();
PositionMapItemPathDTO.setFloor(positionMapDO.getFloor());
@ -418,7 +418,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
.y(Double.valueOf(positionMapItemDO.getActualLocationY()))
.sortNum(positionMapItemDO.getSortNum())
.yaw(Double.parseDouble(positionMapItemDO.getLocationYaw()))
.id(positionMapItemDO.getId()).build();
.id(positionMapItemDO.getId()+"").build();
PositionMapItemPathDTO PositionMapItemPathDTO = new PositionMapItemPathDTO();
PositionMapItemPathDTO.setFloor(positionMapDO.getFloor());

View File

@ -18,7 +18,7 @@ import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotRcsHeartBeatDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotSimulationPoseDTO;
import cn.iocoder.yudao.module.mqtt.enums.task.ExecutionTypeEnum;
import cn.iocoder.yudao.module.system.api.robot.RequestProcessor;
import cn.iocoder.yudao.module.system.api.robot.processor.RequestProcessor;
import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataPoseDTO;

View File

@ -348,7 +348,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
pathPlanning.setReleaseGroupId("POINT_" + v.getPositionMapItemId());
pathPlanning.setReleaseLocationNumber(releaseLocationNumberConfig);
pathPlanning.setReleasePointId(v.getPositionMapItemId());
pathPlanning.setWaitIds(Collections.singletonList(v.getPositionMapItemId() + ""));
String key = PathPlanningChcheConstant.PATH_PLANNING_TASK + pathPlanning.getOrderId();
redisUtil.set(key, JSON.toJSONString(pathPlanning), taskChcheTime);