From ffa26a1fa957dbc66c15f78177bcd2f05358a3e9 Mon Sep 17 00:00:00 2001 From: aikai Date: Thu, 13 Feb 2025 15:38:22 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=A5=BC=E5=8C=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/system/api/robot/dto/FloorZoneDTO.java | 14 ++++++++++++++ .../system/api/robot/dto/RobotStatusDataDTO.java | 5 +++++ .../api/robot/dto/RobotStatusDataPoseDTO.java | 1 + 3 files changed, 20 insertions(+) create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/FloorZoneDTO.java diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/FloorZoneDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/FloorZoneDTO.java new file mode 100644 index 000000000..d7f5018f0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/FloorZoneDTO.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.system.api.robot.dto; + +import lombok.Data; + +/** + * 楼层区域 + */ +@Data +public class FloorZoneDTO { + //地图所在楼 + public String floor; + //地图所在区 + public String area; +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/RobotStatusDataDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/RobotStatusDataDTO.java index 3a1d15bc5..6b97943c6 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/RobotStatusDataDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/RobotStatusDataDTO.java @@ -9,6 +9,11 @@ import java.util.List; */ @Data public class RobotStatusDataDTO { + /** + * 楼层区域 + */ + public FloorZoneDTO floor_zone; + /** * 机器人位姿 */ diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/RobotStatusDataPoseDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/RobotStatusDataPoseDTO.java index ef1afb4db..96d44d74f 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/RobotStatusDataPoseDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/RobotStatusDataPoseDTO.java @@ -9,6 +9,7 @@ import lombok.Data; public class RobotStatusDataPoseDTO { public String y; public String x; + //弧度 public String yaw; //楼层 public String floor; From 8b0713f653e867b61fe69db09fb8e8ad186f882b Mon Sep 17 00:00:00 2001 From: aikai Date: Thu, 13 Feb 2025 15:40:07 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat(websocket):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE=20WebSocket=20=E4=BC=9A=E8=AF=9D=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 getMapSession 方法用于获取地图 WebSocket 会话 - 在 addSession 和 removeSession 中增加对地图会话的处理逻辑 - 优化代码结构,提高可读性和可维护性 --- .../framework/common/enums/NodeTypeEnum.java | 3 +- .../AbstractWebSocketMessageSender.java | 18 ++- .../core/session/WebSocketSessionManager.java | 12 +- .../session/WebSocketSessionManagerImpl.java | 108 +++++++++++------- .../system/api/robot/RobotStatusApiImpl.java | 30 +++-- .../DeviceInformationController.java | 2 +- .../PositionMapItemController.java | 7 ++ .../PositionMapLineController.java | 1 - .../vo/PositionMapItemPageReqVO.java | 9 +- .../vo/PositionMapLinePageReqVO.java | 25 ++++ .../positionmap/vo/PositionMapLineRespVO.java | 32 ++++++ .../vo/PositionMapLineSaveReqVO.java | 25 ++++ .../robot/RobotInformationController.java | 52 +++++---- .../admin/sms/SmsCallbackController.java | 8 +- .../positionmap/PositionMapLineDO.java | 33 ++++++ .../mapnode/NodeProcessingContext.java | 2 + .../PositionMapItemServiceImpl.java | 2 + 17 files changed, 279 insertions(+), 90 deletions(-) diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/NodeTypeEnum.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/NodeTypeEnum.java index 1a7a4826b..0778726ae 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/NodeTypeEnum.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/enums/NodeTypeEnum.java @@ -16,7 +16,8 @@ public enum NodeTypeEnum { DEVICE(3, "设备点"), PARKING(4, "停车点"), CHANGE(5, "区域变更点"), - WAIT(6, "等待点"); + WAIT(6, "等待点"), + TEXT(7, "文字点"); /** * 类型 diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/sender/AbstractWebSocketMessageSender.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/sender/AbstractWebSocketMessageSender.java index 4e0db44c9..dbc969a58 100644 --- a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/sender/AbstractWebSocketMessageSender.java +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/sender/AbstractWebSocketMessageSender.java @@ -44,10 +44,10 @@ public abstract class AbstractWebSocketMessageSender implements WebSocketMessage /** * 发送消息 * - * @param sessionId Session 编号 - * @param userType 用户类型 - * @param userId 用户编号 - * @param messageType 消息类型 + * @param sessionId Session 编号 + * @param userType 用户类型 + * @param userId 用户编号 + * @param messageType 消息类型 * @param messageContent 消息内容 */ public void send(String sessionId, Integer userType, Long userId, String messageType, String messageContent) { @@ -57,6 +57,12 @@ public abstract class AbstractWebSocketMessageSender implements WebSocketMessage WebSocketSession session = sessionManager.getSession(sessionId); if (session != null) { sessions = Collections.singletonList(session); + } else { + // -- 这里用于获取地图的webSocket + session = sessionManager.getMapSession(sessionId); + if (session != null){ + sessions = Collections.singletonList(session); + } } } else if (userType != null && userId != null) { sessions = (List) sessionManager.getSessionList(userType, userId); @@ -74,8 +80,8 @@ public abstract class AbstractWebSocketMessageSender implements WebSocketMessage /** * 发送消息的具体实现 * - * @param sessions Session 列表 - * @param messageType 消息类型 + * @param sessions Session 列表 + * @param messageType 消息类型 * @param messageContent 消息内容 */ public void doSend(Collection sessions, String messageType, String messageContent) { diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/session/WebSocketSessionManager.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/session/WebSocketSessionManager.java index ad1de23c2..b9b3fcdfc 100644 --- a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/session/WebSocketSessionManager.java +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/session/WebSocketSessionManager.java @@ -33,6 +33,14 @@ public interface WebSocketSessionManager { */ WebSocketSession getSession(String id); + /** + * 根据 地图 楼+"_"+区 获取session + * + * @param key + * @return + */ + WebSocketSession getMapSession(String key); + /** * 获得指定用户类型的 Session 列表 * @@ -45,9 +53,9 @@ public interface WebSocketSessionManager { * 获得指定用户编号的 Session 列表 * * @param userType 用户类型 - * @param userId 用户编号 + * @param userId 用户编号 * @return Session 列表 */ Collection getSessionList(Integer userType, Long userId); -} \ No newline at end of file +} diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/session/WebSocketSessionManagerImpl.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/session/WebSocketSessionManagerImpl.java index 6dba89851..9ceceda99 100644 --- a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/session/WebSocketSessionManagerImpl.java +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/session/WebSocketSessionManagerImpl.java @@ -1,15 +1,14 @@ package cn.iocoder.yudao.framework.websocket.core.session; import cn.hutool.core.collection.CollUtil; +import cn.hutool.http.HttpUtil; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.framework.websocket.core.util.WebSocketFrameworkUtils; import org.springframework.web.socket.WebSocketSession; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; +import java.nio.charset.StandardCharsets; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CopyOnWriteArrayList; @@ -23,63 +22,87 @@ public class WebSocketSessionManagerImpl implements WebSocketSessionManager { /** * id 与 WebSocketSession 映射 - * + *

* key:Session 编号 */ private final ConcurrentMap idSessions = new ConcurrentHashMap<>(); /** * user 与 WebSocketSession 映射 - * + *

* key1:用户类型 * key2:用户编号 */ private final ConcurrentMap>> userSessions = new ConcurrentHashMap<>(); + + /** + * 地图 与 WebSocketSession 映射 + *

+ * key:地图地址 楼+'_'+区 + */ + private final ConcurrentMap mapSessions = new ConcurrentHashMap<>(); + @Override public void addSession(WebSocketSession session) { - // 添加到 idSessions 中 - idSessions.put(session.getId(), session); - // 添加到 userSessions 中 - LoginUser user = WebSocketFrameworkUtils.getLoginUser(session); - if (user == null) { - return; - } - ConcurrentMap> userSessionsMap = userSessions.get(user.getUserType()); - if (userSessionsMap == null) { - userSessionsMap = new ConcurrentHashMap<>(); - if (userSessions.putIfAbsent(user.getUserType(), userSessionsMap) != null) { - userSessionsMap = userSessions.get(user.getUserType()); + // 解析 session Url 中参数 + Map paramMap = HttpUtil.decodeParamMap(String.valueOf(session.getUri()), StandardCharsets.UTF_8); + String type = paramMap.get("type"); + // -- 如果是地图里面过来的 + if ("map".equals(type)) { + mapSessions.put(paramMap.get("floor") + "_" + paramMap.get("area"), session); + } else { + // 添加到 idSessions 中 + idSessions.put(session.getId(), session); + // 添加到 userSessions 中 + LoginUser user = WebSocketFrameworkUtils.getLoginUser(session); + if (user == null) { + return; } - } - CopyOnWriteArrayList sessions = userSessionsMap.get(user.getId()); - if (sessions == null) { - sessions = new CopyOnWriteArrayList<>(); - if (userSessionsMap.putIfAbsent(user.getId(), sessions) != null) { - sessions = userSessionsMap.get(user.getId()); + ConcurrentMap> userSessionsMap = userSessions.get(user.getUserType()); + if (userSessionsMap == null) { + userSessionsMap = new ConcurrentHashMap<>(); + if (userSessions.putIfAbsent(user.getUserType(), userSessionsMap) != null) { + userSessionsMap = userSessions.get(user.getUserType()); + } } + CopyOnWriteArrayList sessions = userSessionsMap.get(user.getId()); + if (sessions == null) { + sessions = new CopyOnWriteArrayList<>(); + if (userSessionsMap.putIfAbsent(user.getId(), sessions) != null) { + sessions = userSessionsMap.get(user.getId()); + } + } + sessions.add(session); } - sessions.add(session); } @Override public void removeSession(WebSocketSession session) { - // 移除从 idSessions 中 - idSessions.remove(session.getId()); - // 移除从 idSessions 中 - LoginUser user = WebSocketFrameworkUtils.getLoginUser(session); - if (user == null) { - return; - } - ConcurrentMap> userSessionsMap = userSessions.get(user.getUserType()); - if (userSessionsMap == null) { - return; - } - CopyOnWriteArrayList sessions = userSessionsMap.get(user.getId()); - sessions.removeIf(session0 -> session0.getId().equals(session.getId())); - if (CollUtil.isEmpty(sessions)) { - userSessionsMap.remove(user.getId(), sessions); + // 解析 session Url 中参数 + Map paramMap = HttpUtil.decodeParamMap(String.valueOf(session.getUri()), StandardCharsets.UTF_8); + String type = paramMap.get("type"); + // -- 如果是地图里面过来的 + if ("map".equals(type)) { + mapSessions.remove(paramMap.get("floor") + "_" + paramMap.get("area"), session); + } else { + // 移除从 idSessions 中 + idSessions.remove(session.getId()); + // 移除从 idSessions 中 + LoginUser user = WebSocketFrameworkUtils.getLoginUser(session); + if (user == null) { + return; + } + ConcurrentMap> userSessionsMap = userSessions.get(user.getUserType()); + if (userSessionsMap == null) { + return; + } + CopyOnWriteArrayList sessions = userSessionsMap.get(user.getId()); + sessions.removeIf(session0 -> session0.getId().equals(session.getId())); + if (CollUtil.isEmpty(sessions)) { + userSessionsMap.remove(user.getId(), sessions); + } } } @@ -88,6 +111,11 @@ public class WebSocketSessionManagerImpl implements WebSocketSessionManager { return idSessions.get(id); } + @Override + public WebSocketSession getMapSession(String key) { + return mapSessions.get(key); + } + @Override public Collection getSessionList(Integer userType) { ConcurrentMap> userSessionsMap = userSessions.get(userType); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java index 2ff94fd8d..0bc1019be 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.api.robot; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; +import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO; import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataErrorDTO; import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataPoseDTO; @@ -50,6 +51,7 @@ public class RobotStatusApiImpl implements RobotStatusApi { /** * 更新机器人点位/异常/能否做任务 + * * @param robotStatusDataDTO * @return */ @@ -61,24 +63,31 @@ public class RobotStatusApiImpl implements RobotStatusApi { return; } - String taskStatusKey = RobotTaskChcheConstant.ROBOT_TASK_STATUS +robotStatusDataDTO.getMac(); - String cargoDetectedKey = RobotTaskChcheConstant.ROBOT_CARGO_DETECTED +robotStatusDataDTO.getMac(); - String pose2dKey = RobotTaskChcheConstant.ROBOT_POSE_BAT +robotStatusDataDTO.getMac(); - redisUtil.set(taskStatusKey, robotStatusDataDTO.getData().getTask_status(),robotPositionCacheTime); - redisUtil.set(cargoDetectedKey,robotStatusDataDTO.getData().getCargo_detected(),robotPositionCacheTime); + String taskStatusKey = RobotTaskChcheConstant.ROBOT_TASK_STATUS + robotStatusDataDTO.getMac(); + String cargoDetectedKey = RobotTaskChcheConstant.ROBOT_CARGO_DETECTED + robotStatusDataDTO.getMac(); + String pose2dKey = RobotTaskChcheConstant.ROBOT_POSE_BAT + robotStatusDataDTO.getMac(); + redisUtil.set(taskStatusKey, robotStatusDataDTO.getData().getTask_status(), robotPositionCacheTime); + redisUtil.set(cargoDetectedKey, robotStatusDataDTO.getData().getCargo_detected(), robotPositionCacheTime); Object object = redisUtil.get(pose2dKey); - RobotStatusDataPoseDTO robotStatusDataPoseDTO= JSONUtil.toBean((String)object, RobotStatusDataPoseDTO.class); + RobotStatusDataPoseDTO robotStatusDataPoseDTO = JSONUtil.toBean((String) object, RobotStatusDataPoseDTO.class); robotStatusDataPoseDTO.setX(robotStatusDataDTO.getData().getPose2d().getX()); robotStatusDataPoseDTO.setY(robotStatusDataDTO.getData().getPose2d().getY()); robotStatusDataPoseDTO.setYaw(robotStatusDataDTO.getData().getPose2d().getYaw()); - redisUtil.set(pose2dKey,JSON.toJSONString(robotStatusDataPoseDTO),robotPositionCacheTime); + redisUtil.set(pose2dKey, JSON.toJSONString(robotStatusDataPoseDTO), robotPositionCacheTime); + + // -- webSocket 推送过来的机器人点位信息 - + + // -- 上报的时候没有地图信息 - 那么?怎么获取到这个地图的信息呢? - + + + // - 这里的接口需要接受 if (ObjectUtil.isNotNull(robotStatusDataDTO.getData().getErr_code())) { List errCode = robotStatusDataDTO.getData().getErr_code(); String robotNo = robotInformationService.getRobotNoByMac(robotStatusDataDTO.getMac()); if (ObjectUtil.isNull(robotNo)) { - log.info("查不到机器人编号 :{}",robotStatusDataDTO.getMac()); + log.info("查不到机器人编号 :{}", robotStatusDataDTO.getMac()); return; } @@ -86,7 +95,7 @@ public class RobotStatusApiImpl implements RobotStatusApi { errCode.stream().map(RobotStatusDataErrorDTO::getError_code).collect(Collectors.toList()); List robotWarnCodeMappingDOS = warnCodeMappingMapper.selectList(new LambdaQueryWrapper() - .in(RobotWarnCodeMappingDO::getWarnCode, warnCodes)); + .in(RobotWarnCodeMappingDO::getWarnCode, warnCodes)); if (ObjectUtil.isEmpty(robotWarnCodeMappingDOS)) { log.info("查不对应编号的告警信息 :{}", JSON.toJSONString(warnCodes)); return; @@ -100,7 +109,7 @@ public class RobotStatusApiImpl implements RobotStatusApi { for (RobotStatusDataErrorDTO robotStatusData : errCode) { List mappingDOS = warnCodeMapping.get(robotStatusData.getError_code()); if (ObjectUtil.isEmpty(mappingDOS)) { - log.info("当前告警类型查不到对应的告警信息 :{}",robotStatusData.getError_code()); + log.info("当前告警类型查不到对应的告警信息 :{}", robotStatusData.getError_code()); continue; } RobotWarnMsgDO warnMsg = RobotWarnMsgDO.builder().warnLevel(Integer.valueOf(robotStatusData.getCode_level())) @@ -117,5 +126,4 @@ public class RobotStatusApiImpl implements RobotStatusApi { } - } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/DeviceInformationController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/DeviceInformationController.java index 1fe556188..f8afceb2e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/DeviceInformationController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/information/DeviceInformationController.java @@ -83,7 +83,7 @@ public class DeviceInformationController { @PostMapping("/mapBindDeviceInfo") @Operation(summary = "地图绑定设备") - public CommonResult mapBindDeviceInfo(@Valid MapBindDeviceInfoDTO dto) { + public CommonResult mapBindDeviceInfo(@Valid @RequestBody MapBindDeviceInfoDTO dto) { informationService.mapBindDeviceInfo(dto); return success(true); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/PositionMapItemController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/PositionMapItemController.java index 7d9ed85e3..6e8e3b9b3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/PositionMapItemController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/PositionMapItemController.java @@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMa import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO; import cn.iocoder.yudao.module.system.handler.mapnode.NodeProcessingContext; import cn.iocoder.yudao.module.system.service.positionmap.PositionMapItemService; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -43,6 +44,12 @@ public class PositionMapItemController { @Resource private NodeProcessingContext nodeProcessingContext; + @GetMapping("/getMapItemId") + @Operation(summary = "获取节点id") + public CommonResult getMapItemId() { + return success(String.valueOf(IdWorker.getId())); + } + // -- 前端给所有的节点信息 - @PostMapping("/batchSaveOrEditOrDel") @Operation(summary = "批量新增编辑删除节点") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/PositionMapLineController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/PositionMapLineController.java index e9133d8ac..9242d0104 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/PositionMapLineController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/PositionMapLineController.java @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.system.controller.admin.positionmap; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapLineRespVO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapLineSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapLineDO; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemPageReqVO.java index 4870daf3a..b04440efd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemPageReqVO.java @@ -1,11 +1,12 @@ package cn.iocoder.yudao.module.system.controller.admin.positionmap.vo; -import com.alibaba.excel.annotation.ExcelProperty; -import lombok.*; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; + import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapLinePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapLinePageReqVO.java index 37b3bfed1..61bc7f17b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapLinePageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapLinePageReqVO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.system.controller.admin.positionmap.vo; import cn.iocoder.yudao.framework.common.pojo.PageParam; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -27,6 +28,30 @@ public class PositionMapLinePageReqVO extends PageParam { @Schema(description = "结束点id(点位子表id)", example = "15890") private Long endPointId; + @Schema(description = "开始控制点x轴", example = "15890") + private String beginControlX; + + @Schema(description = "开始控制点y轴", example = "15890") + private String beginControlY; + + @Schema(description = "结束控制点x轴", example = "15890") + private String endControlX; + + @Schema(description = "结束控制点y轴", example = "15890") + private String endControlY; + + @Schema(description = "膨胀区域前", example = "15890") + private BigDecimal expansionZoneFront; + + @Schema(description = "膨胀区域后", example = "15890") + private BigDecimal expansionZoneAfter; + + @Schema(description = "膨胀区域左", example = "15890") + private BigDecimal expansionZoneLeft; + + @Schema(description = "膨胀区域右", example = "15890") + private BigDecimal expansionZoneRight; + @Schema(description = "行走方法 0.直线 1.上左曲线2.上右曲线3.下左曲线 4.下右曲线") private Integer method; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapLineRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapLineRespVO.java index d07ea1bde..f816fe85d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapLineRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapLineRespVO.java @@ -29,6 +29,38 @@ public class PositionMapLineRespVO { @ExcelProperty("结束点id(点位子表id)") private Long endPointId; + @Schema(description = "开始控制点x轴", example = "15890") + @ExcelProperty("开始控制点x轴") + private String beginControlX; + + @Schema(description = "开始控制点y轴", example = "15890") + @ExcelProperty("开始控制点y轴") + private String beginControlY; + + @Schema(description = "结束控制点x轴", example = "15890") + @ExcelProperty("结束控制点x轴") + private String endControlX; + + @Schema(description = "结束控制点y轴", example = "15890") + @ExcelProperty("结束控制点y轴") + private String endControlY; + + @Schema(description = "膨胀区域前", example = "15890") + @ExcelProperty("膨胀区域前") + private BigDecimal expansionZoneFront; + + @Schema(description = "膨胀区域后", example = "15890") + @ExcelProperty("膨胀区域后") + private BigDecimal expansionZoneAfter; + + @Schema(description = "膨胀区域左", example = "15890") + @ExcelProperty("膨胀区域左") + private BigDecimal expansionZoneLeft; + + @Schema(description = "膨胀区域右", example = "15890") + @ExcelProperty("膨胀区域右") + private BigDecimal expansionZoneRight; + @Schema(description = "行走方法 0.直线 1.上左曲线2.上右曲线3.下左曲线 4.下右曲线") @ExcelProperty("行走方法 0.直线 1.上左曲线2.上右曲线3.下左曲线 4.下右曲线") private Integer method; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapLineSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapLineSaveReqVO.java index d284e00e4..4fe4bde7e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapLineSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapLineSaveReqVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.system.controller.admin.positionmap.vo; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -24,6 +25,30 @@ public class PositionMapLineSaveReqVO { @Schema(description = "结束点id(点位子表id)", example = "15890") private Long endPointId; + @Schema(description = "开始控制点x轴", example = "15890") + private String beginControlX; + + @Schema(description = "开始控制点y轴", example = "15890") + private String beginControlY; + + @Schema(description = "结束控制点x轴", example = "15890") + private String endControlX; + + @Schema(description = "结束控制点y轴", example = "15890") + private String endControlY; + + @Schema(description = "膨胀区域前", example = "15890") + private BigDecimal expansionZoneFront; + + @Schema(description = "膨胀区域后", example = "15890") + private BigDecimal expansionZoneAfter; + + @Schema(description = "膨胀区域左", example = "15890") + private BigDecimal expansionZoneLeft; + + @Schema(description = "膨胀区域右", example = "15890") + private BigDecimal expansionZoneRight; + @Schema(description = "行走方法 0.直线 1.上左曲线2.上右曲线3.下左曲线 4.下右曲线") private Integer method; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java index 056a0893e..f5d0c2fda 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java @@ -1,32 +1,32 @@ package cn.iocoder.yudao.module.system.controller.admin.robot; +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; import cn.iocoder.yudao.module.system.service.robot.RobotInformationService; -import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.security.access.prepost.PreAuthorize; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; -import javax.validation.*; -import javax.servlet.http.*; -import java.util.*; +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; import java.io.IOException; +import java.util.List; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; - -import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; -import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; - @Tag(name = "管理后台 - 车辆信息") @RestController @@ -36,6 +36,8 @@ public class RobotInformationController { @Resource private RobotInformationService informationService; + @Resource + private WebSocketSenderApi webSocketSenderApi; @PostMapping("/create") @Operation(summary = "创建车辆信息") @@ -44,6 +46,14 @@ public class RobotInformationController { return success(informationService.createInformation(createReqVO)); } + @PostMapping("/test") + @PermitAll + @Operation(summary = "测试") + public CommonResult test(@RequestParam String id, @RequestParam String msg) { + webSocketSenderApi.sendObject(id,"map_push", msg); + return success(true); + } + @PutMapping("/update") @Operation(summary = "更新车辆信息") @PreAuthorize("@ss.hasPermission('robot:information:update')") @@ -83,12 +93,12 @@ public class RobotInformationController { @PreAuthorize("@ss.hasPermission('robot:information:export')") @ApiAccessLog(operateType = EXPORT) public void exportInformationExcel(@Valid RobotInformationPageReqVO pageReqVO, - HttpServletResponse response) throws IOException { + HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = informationService.getInformationPage(pageReqVO).getList(); // 导出 Excel ExcelUtils.write(response, "车辆信息.xls", "数据", RobotInformationPageRespVO.class, - BeanUtils.toBean(list, RobotInformationPageRespVO.class)); + BeanUtils.toBean(list, RobotInformationPageRespVO.class)); } @PostMapping("/statistics") @@ -114,4 +124,4 @@ public class RobotInformationController { return success(BeanUtils.toBean(result, RobotInformationRespVO.class)); } -} \ No newline at end of file +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java index b682ea9d6..2f3f023c6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/SmsCallbackController.java @@ -6,7 +6,10 @@ import cn.iocoder.yudao.module.system.framework.sms.core.enums.SmsChannelEnum; import cn.iocoder.yudao.module.system.service.sms.SmsSendService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.annotation.security.PermitAll; @@ -30,7 +33,6 @@ public class SmsCallbackController { smsSendService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text); return success(true); } - @PostMapping("/tencent") @PermitAll @Operation(summary = "腾讯云短信的回调", description = "参见 https://cloud.tencent.com/document/product/382/52077 文档") @@ -57,4 +59,4 @@ public class SmsCallbackController { return success(true); } -} \ No newline at end of file +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionMapLineDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionMapLineDO.java index 676560b64..16d2050f4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionMapLineDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionMapLineDO.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.math.BigDecimal; @@ -41,6 +42,38 @@ public class PositionMapLineDO extends BaseDO { * 结束点id(点位子表id) */ private Long endPointId; + /** + * 开始控制点x轴 + */ + private String beginControlX; + /** + * 开始控制点y轴 + */ + private String beginControlY; + /** + * 结束控制点x轴 + */ + private String endControlX; + /** + * 结束控制点y轴 + */ + private String endControlY; + /** + * 膨胀区域前 + */ + private BigDecimal expansionZoneFront; + /** + * 膨胀区域后 + */ + private BigDecimal expansionZoneAfter; + /** + * 膨胀区域左 + */ + private BigDecimal expansionZoneLeft; + /** + * 膨胀区域右 + */ + private BigDecimal expansionZoneRight; /** * 行走方法 0.直线 1.上左曲线2.上右曲线3.下左曲线 4.下右曲线 */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/NodeProcessingContext.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/NodeProcessingContext.java index 6ccf624b7..eed2dc3e4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/NodeProcessingContext.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/handler/mapnode/NodeProcessingContext.java @@ -50,6 +50,8 @@ public class NodeProcessingContext { strategyMap.put(NodeTypeEnum.CHANGE.getType(), mapNodeStrategyImpl); // 等待点 strategyMap.put(NodeTypeEnum.WAIT.getType(), mapNodeStrategyImpl); + // 文字点 + strategyMap.put(NodeTypeEnum.TEXT.getType(), mapNodeStrategyImpl); // todo 可以继续添加更多的策略 - 新增实现即可 } 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 db6f8d985..f5edce992 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 @@ -72,9 +72,11 @@ public class PositionMapItemServiceImpl extends ServiceImpl> list) { //批量添加、修改、删除 if (isNotEmpty(list.get(0))) { + list.get(0).forEach(a -> a.setPositionMapId(positionMapId)); positionMapItemMapper.insertBatch(list.get(0)); } if (isNotEmpty(list.get(1))) { + list.get(1).forEach(a -> a.setPositionMapId(positionMapId)); positionMapItemMapper.updateBatch(list.get(1)); } if (isNotEmpty(list.get(2))) { From 8565c226cf0e7f5b8e859c2cd54d41731c22f9d9 Mon Sep 17 00:00:00 2001 From: aikai Date: Fri, 14 Feb 2025 11:46:13 +0800 Subject: [PATCH 3/5] =?UTF-8?q?feat(system):=20=E6=B7=BB=E5=8A=A0=E6=9C=BA?= =?UTF-8?q?=E5=99=A8=E4=BA=BA=E7=8A=B6=E6=80=81=E6=B5=8B=E8=AF=95=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=B9=B6=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 RobotInformationController 中添加 test 接口,用于测试机器人状态 - 在 RobotInformationService 中添加 test 方法,处理机器人状态数据 - 在 HouseAreaService 中修改 getHouseAreaList 方法,增加 positionMapId 参数- 在 application-local.yaml 中更新数据库连接 URL,添加 allowMultiQueries 参数 - 新增 RequestProcessor 类,用于处理和发送机器人状态数据 --- .../system/api/robot/RequestProcessor.java | 61 +++++++++++++++++++ .../system/api/robot/RobotStatusApiImpl.java | 35 +++++++---- .../admin/housearea/HouseAreaController.java | 4 +- .../robot/RobotInformationController.java | 20 +++--- .../service/housearea/HouseAreaService.java | 2 +- .../housearea/HouseAreaServiceImpl.java | 7 +-- .../robot/RobotInformationService.java | 8 ++- .../robot/RobotInformationServiceImpl.java | 36 +++++++++-- .../src/main/resources/application-local.yaml | 6 +- 9 files changed, 138 insertions(+), 41 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RequestProcessor.java diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RequestProcessor.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RequestProcessor.java new file mode 100644 index 000000000..878b98acc --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RequestProcessor.java @@ -0,0 +1,61 @@ +package cn.iocoder.yudao.module.system.api.robot; + +import cn.hutool.core.map.MapUtil; +import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.PreDestroy; +import javax.annotation.Resource; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +@Component +@Slf4j +public class RequestProcessor { + private final ConcurrentHashMap> cache = new ConcurrentHashMap<>(); + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + + @Resource + public WebSocketSenderApi webSocketSenderApi; + + public RequestProcessor() { + // 每秒执行一次 - 处理并发送数据 - 避免数据丢失 + scheduler.scheduleAtFixedRate(this::processAndSend, 1, 1, TimeUnit.SECONDS); + } + + public void handleRequest(String map, String mac, String data) { + cache.computeIfAbsent(map, k -> new ConcurrentHashMap<>()).put(mac, data); + } + + + private void processAndSend() { + Map> snapshot = new ConcurrentHashMap<>(cache); // 创建快照 + cache.clear(); // 先清理缓存 + for (Map.Entry> entry : snapshot.entrySet()) { + if (!MapUtil.isEmpty(entry.getValue())) { + sendData(entry.getKey(), entry.getValue()); + } + } + } + + private void sendData(String map, Map data) { + // -- 发送给对应的websocket +// System.out.println("key:" + map + "发送数据:" + data); + log.info("key:" + map + "发送数据:" + data); + webSocketSenderApi.sendObject(map, "map_push", data); + } + + public void shutdown() { + scheduler.shutdown(); + } + + @PreDestroy + public void destroy() { + // 在Bean销毁前关闭去啊 + shutdown(); + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java index 557cd2bfb..8d9c78b90 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java @@ -24,6 +24,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -48,8 +49,12 @@ public class RobotStatusApiImpl implements RobotStatusApi { @Value("${zn.robot_position_cache_time:600}") private Long robotPositionCacheTime; + @Resource + private RequestProcessor processor; + /** * 更新机器人点位/异常/能否做任务 + * * @param robotStatusDataDTO * @return */ @@ -61,26 +66,31 @@ public class RobotStatusApiImpl implements RobotStatusApi { return; } - String taskStatusKey = RobotTaskChcheConstant.ROBOT_TASK_STATUS +robotStatusDataDTO.getMac(); - String cargoDetectedKey = RobotTaskChcheConstant.ROBOT_CARGO_DETECTED +robotStatusDataDTO.getMac(); - String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC +robotStatusDataDTO.getMac(); - redisUtil.set(taskStatusKey, robotStatusDataDTO.getData().getTask_status(),robotPositionCacheTime); - redisUtil.set(cargoDetectedKey,robotStatusDataDTO.getData().getCargo_detected(),robotPositionCacheTime); + String taskStatusKey = RobotTaskChcheConstant.ROBOT_TASK_STATUS + robotStatusDataDTO.getMac(); + String cargoDetectedKey = RobotTaskChcheConstant.ROBOT_CARGO_DETECTED + robotStatusDataDTO.getMac(); + String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + robotStatusDataDTO.getMac(); + redisUtil.set(taskStatusKey, robotStatusDataDTO.getData().getTask_status(), robotPositionCacheTime); + redisUtil.set(cargoDetectedKey, robotStatusDataDTO.getData().getCargo_detected(), robotPositionCacheTime); Object object = redisUtil.get(pose2dKey); - RobotStatusDataPoseDTO robotStatusDataPoseDTO= JSONUtil.toBean((String)object, RobotStatusDataPoseDTO.class); + RobotStatusDataPoseDTO robotStatusDataPoseDTO = JSONUtil.toBean((String) object, RobotStatusDataPoseDTO.class); robotStatusDataPoseDTO.setX(robotStatusDataDTO.getData().getPose2d().getX()); robotStatusDataPoseDTO.setY(robotStatusDataDTO.getData().getPose2d().getY()); robotStatusDataPoseDTO.setYaw(robotStatusDataDTO.getData().getPose2d().getYaw()); - robotStatusDataPoseDTO.setFloor(robotStatusDataDTO.getData().getPose2d().getFloor()); - robotStatusDataPoseDTO.setArea(robotStatusDataDTO.getData().getPose2d().getArea()); - redisUtil.set(pose2dKey,JSON.toJSONString(robotStatusDataPoseDTO),robotPositionCacheTime); + robotStatusDataPoseDTO.setFloor(robotStatusDataDTO.getData().getFloor_zone().getFloor()); + robotStatusDataPoseDTO.setArea(robotStatusDataDTO.getData().getFloor_zone().getArea()); + redisUtil.set(pose2dKey, JSON.toJSONString(robotStatusDataPoseDTO), robotPositionCacheTime); + + // 模拟请求 + processor.handleRequest(robotStatusDataPoseDTO.getFloor() + "_" + robotStatusDataPoseDTO.getArea(), + robotStatusDataDTO.getMac(), JSONUtil.toJsonStr(robotStatusDataDTO.getData().getPose2d())); + if (ObjectUtil.isNotNull(robotStatusDataDTO.getData().getErr_code())) { List errCode = robotStatusDataDTO.getData().getErr_code(); String robotNo = robotInformationService.getRobotNoByMac(robotStatusDataDTO.getMac()); if (ObjectUtil.isNull(robotNo)) { - log.info("查不到机器人编号 :{}",robotStatusDataDTO.getMac()); + log.info("查不到机器人编号 :{}", robotStatusDataDTO.getMac()); return; } @@ -88,7 +98,7 @@ public class RobotStatusApiImpl implements RobotStatusApi { errCode.stream().map(RobotStatusDataErrorDTO::getError_code).collect(Collectors.toList()); List robotWarnCodeMappingDOS = warnCodeMappingMapper.selectList(new LambdaQueryWrapper() - .in(RobotWarnCodeMappingDO::getWarnCode, warnCodes)); + .in(RobotWarnCodeMappingDO::getWarnCode, warnCodes)); if (ObjectUtil.isEmpty(robotWarnCodeMappingDOS)) { log.info("查不对应编号的告警信息 :{}", JSON.toJSONString(warnCodes)); return; @@ -102,7 +112,7 @@ public class RobotStatusApiImpl implements RobotStatusApi { for (RobotStatusDataErrorDTO robotStatusData : errCode) { List mappingDOS = warnCodeMapping.get(robotStatusData.getError_code()); if (ObjectUtil.isEmpty(mappingDOS)) { - log.info("当前告警类型查不到对应的告警信息 :{}",robotStatusData.getError_code()); + log.info("当前告警类型查不到对应的告警信息 :{}", robotStatusData.getError_code()); continue; } RobotWarnMsgDO warnMsg = RobotWarnMsgDO.builder().warnLevel(Integer.valueOf(robotStatusData.getCode_level())) @@ -119,5 +129,4 @@ public class RobotStatusApiImpl implements RobotStatusApi { } - } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/housearea/HouseAreaController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/housearea/HouseAreaController.java index 4c31153b4..86732f3e6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/housearea/HouseAreaController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/housearea/HouseAreaController.java @@ -82,8 +82,8 @@ public class HouseAreaController { @GetMapping("/getHouseAreaList") @Operation(summary = "获得全部库区") @PreAuthorize("@ss.hasPermission('ware:house-area:query')") - public CommonResult> getHouseAreaList() { - List list = houseAreaService.getHouseAreaList(); + public CommonResult> getHouseAreaList(@RequestParam Long positionMapId) { + List list = houseAreaService.getHouseAreaList(positionMapId); return success(BeanUtils.toBean(list, HouseAreaRespVO.class)); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java index f5d0c2fda..aa2336132 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java @@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; +import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; import cn.iocoder.yudao.module.system.service.robot.RobotInformationService; @@ -36,8 +36,14 @@ public class RobotInformationController { @Resource private RobotInformationService informationService; - @Resource - private WebSocketSenderApi webSocketSenderApi; + + @PostMapping("/test") + @Operation(summary = "测试") + @PermitAll + public CommonResult test(@RequestBody RobotStatusDTO dto) { + informationService.test(dto); + return success(true); + } @PostMapping("/create") @Operation(summary = "创建车辆信息") @@ -46,14 +52,6 @@ public class RobotInformationController { return success(informationService.createInformation(createReqVO)); } - @PostMapping("/test") - @PermitAll - @Operation(summary = "测试") - public CommonResult test(@RequestParam String id, @RequestParam String msg) { - webSocketSenderApi.sendObject(id,"map_push", msg); - return success(true); - } - @PutMapping("/update") @Operation(summary = "更新车辆信息") @PreAuthorize("@ss.hasPermission('robot:information:update')") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/housearea/HouseAreaService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/housearea/HouseAreaService.java index 5d7275044..8c6475fd6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/housearea/HouseAreaService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/housearea/HouseAreaService.java @@ -64,5 +64,5 @@ public interface HouseAreaService { * 获得全部库区 * @return */ - List getHouseAreaList(); + List getHouseAreaList(Long positionMapId); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/housearea/HouseAreaServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/housearea/HouseAreaServiceImpl.java index 3e9f356a2..cb35de163 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/housearea/HouseAreaServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/housearea/HouseAreaServiceImpl.java @@ -14,7 +14,6 @@ import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionM import cn.iocoder.yudao.module.system.dal.dataobject.housearea.HouseAreaDO; import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO; import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO; -import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotModelDO; import cn.iocoder.yudao.module.system.dal.mysql.housearea.HouseAreaMapper; import cn.iocoder.yudao.module.system.service.houselocation.HouseLocationService; import cn.iocoder.yudao.module.system.service.positionmap.PositionMapItemService; @@ -157,10 +156,10 @@ public class HouseAreaServiceImpl implements HouseAreaService { } @Override - public List getHouseAreaList() { - List list = houseAreaMapper.selectList(new LambdaQueryWrapper() + public List getHouseAreaList(Long positionMapId) { + return houseAreaMapper.selectList(new LambdaQueryWrapper() + .eq(HouseAreaDO::getPositionMapId, positionMapId) .orderByAsc(HouseAreaDO::getId)); - return list; } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java index b1265bf10..9017637c2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java @@ -4,6 +4,7 @@ import java.util.*; import javax.validation.*; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; @@ -77,4 +78,9 @@ public interface RobotInformationService { */ String getRobotNoByMac(String mac); -} \ No newline at end of file + /** + * + * @param dto + */ + void test(@Valid RobotStatusDTO dto); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java index 6ccf44a78..7b00d6cec 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java @@ -3,6 +3,11 @@ package cn.iocoder.yudao.module.system.service.robot; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; +import cn.iocoder.yudao.module.system.api.robot.RequestProcessor; +import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO; import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataPoseDTO; import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; @@ -18,13 +23,11 @@ import cn.iocoder.yudao.module.system.enums.robot.*; import cn.iocoder.yudao.module.system.util.redis.RedisUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.stereotype.Service; -import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; -import java.util.*; -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; - +import javax.annotation.Resource; +import java.util.List; +import java.util.Set; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; @@ -52,6 +55,8 @@ public class RobotInformationServiceImpl implements RobotInformationService { @Resource private RedisUtil redisUtil; + @Resource + private RequestProcessor processor; @Override public Long createInformation(RobotInformationSaveReqVO createReqVO) { @@ -308,4 +313,23 @@ public class RobotInformationServiceImpl implements RobotInformationService { return ""; } -} \ No newline at end of file + @Override + public void test(RobotStatusDTO robotStatusDataDTO) { + TenantContextHolder.setTenantId(1L); + if (ObjectUtil.isEmpty(robotStatusDataDTO) || ObjectUtil.isEmpty(robotStatusDataDTO.getMac())) { + return; + } + RobotStatusDataPoseDTO robotStatusDataPoseDTO = new RobotStatusDataPoseDTO(); + robotStatusDataPoseDTO.setX(robotStatusDataDTO.getData().getPose2d().getX()); + robotStatusDataPoseDTO.setY(robotStatusDataDTO.getData().getPose2d().getY()); + robotStatusDataPoseDTO.setYaw(robotStatusDataDTO.getData().getPose2d().getYaw()); + robotStatusDataPoseDTO.setFloor(robotStatusDataDTO.getData().getFloor_zone().getFloor()); + robotStatusDataPoseDTO.setArea(robotStatusDataDTO.getData().getFloor_zone().getArea()); + robotStatusDataPoseDTO.setBat_soc(robotStatusDataDTO.getData().getPose2d().getBat_soc()); + // 模拟请求 + processor.handleRequest(robotStatusDataDTO.getData().getFloor_zone().getFloor() + "_" + robotStatusDataDTO.getData().getFloor_zone().getArea(), + robotStatusDataDTO.getMac(), JSONUtil.toJsonStr(robotStatusDataPoseDTO)); + + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml index bbb91d42c..621594aeb 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml @@ -58,7 +58,7 @@ spring: primary: master datasource: master: - url: jdbc:mysql://47.97.8.94:3306/zn_wcs?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://47.97.8.94:3306/zn_wcs?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true&allowMultiQueries=true # MySQL Connector/J 8.X 连接的示例 # url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例 # url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例 # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 @@ -72,7 +72,7 @@ spring: # password: SYSDBA # DM 连接的示例 slave: # 模拟从库,可根据自己需要修改 lazy: true # 开启懒加载,保证启动速度 - url: jdbc:mysql://47.97.8.94:3306/zn_wcs?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true + url: jdbc:mysql://47.97.8.94:3306/zn_wcs?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true&allowMultiQueries=true username: root password: yhtkj@2024! @@ -229,4 +229,4 @@ zn: lane_auto_move: true #线库是否自动移库 true:线库执行自动移库 、false:线库关闭执行自动移库 robot_position_cache_time: 10 #机器人上报点位存储时间 cycle_do_auto_move: true #存在循环的任务,是否开启自动移库. true:存在循环任务,开启自动移库; false:有循环任务不自动移库 - full_electricity: 100 #机器人充满电的电量 \ No newline at end of file + full_electricity: 100 #机器人充满电的电量 From 22c8eca028657fef06824ced93331b8d2f833a43 Mon Sep 17 00:00:00 2001 From: aikai Date: Fri, 14 Feb 2025 11:46:47 +0800 Subject: [PATCH 4/5] =?UTF-8?q?feat(system):=20=E6=B7=BB=E5=8A=A0=E6=9C=BA?= =?UTF-8?q?=E5=99=A8=E4=BA=BA=E7=8A=B6=E6=80=81=E6=B5=8B=E8=AF=95=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=B9=B6=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 RobotInformationController 中添加 test 接口,用于测试机器人状态 - 在 RobotInformationService 中添加 test 方法,处理机器人状态数据 - 在 HouseAreaService 中修改 getHouseAreaList 方法,增加 positionMapId 参数- 在 application-local.yaml 中更新数据库连接 URL,添加 allowMultiQueries 参数 - 新增 RequestProcessor 类,用于处理和发送机器人状态数据 --- .../robot/RobotInformationController.java | 10 ---- .../robot/RobotInformationService.java | 17 +++--- .../robot/RobotInformationServiceImpl.java | 57 ++++++------------- 3 files changed, 25 insertions(+), 59 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java index aa2336132..a5205a2c8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java @@ -6,7 +6,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; import cn.iocoder.yudao.module.system.service.robot.RobotInformationService; @@ -18,7 +17,6 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import javax.annotation.security.PermitAll; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; @@ -37,14 +35,6 @@ public class RobotInformationController { @Resource private RobotInformationService informationService; - @PostMapping("/test") - @Operation(summary = "测试") - @PermitAll - public CommonResult test(@RequestBody RobotStatusDTO dto) { - informationService.test(dto); - return success(true); - } - @PostMapping("/create") @Operation(summary = "创建车辆信息") @PreAuthorize("@ss.hasPermission('robot:information:create')") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java index 9017637c2..ed46d39d0 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java @@ -1,13 +1,12 @@ package cn.iocoder.yudao.module.system.service.robot; -import java.util.*; -import javax.validation.*; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; +import javax.validation.Valid; +import java.util.List; + /** * 车辆信息 Service 接口 * @@ -55,32 +54,30 @@ public interface RobotInformationService { /** * 统计车辆待命/任务中/离线 + * * @return */ RobotInformationStatisticsVO statisticsInformation(); /** * 查询能正常使用的车辆 + * * @return */ List getCanUseRobot(); /** * 查询所有车辆 + * * @return */ List getAllRobot(); /** * 查询机器人编号 + * * @param mac * @return */ String getRobotNoByMac(String mac); - - /** - * - * @param dto - */ - void test(@Valid RobotStatusDTO dto); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java index 7b00d6cec..b6aedfa5d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java @@ -5,9 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.module.system.api.robot.RequestProcessor; -import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO; import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataPoseDTO; import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; @@ -55,8 +53,6 @@ public class RobotInformationServiceImpl implements RobotInformationService { @Resource private RedisUtil redisUtil; - @Resource - private RequestProcessor processor; @Override public Long createInformation(RobotInformationSaveReqVO createReqVO) { @@ -110,7 +106,7 @@ public class RobotInformationServiceImpl implements RobotInformationService { // 更新 RobotInformationDO updateObj = BeanUtils.toBean(updateReqVO, RobotInformationDO.class); informationMapper.updateById(updateObj); - redisUtil.set(RobotTaskChcheConstant.ROBOT_GET_ROBOTNO_BY_MAC + updateObj.getMacAddress(),updateObj.getRobotNo()); + redisUtil.set(RobotTaskChcheConstant.ROBOT_GET_ROBOTNO_BY_MAC + updateObj.getMacAddress(), updateObj.getRobotNo()); } @Override @@ -162,14 +158,15 @@ public class RobotInformationServiceImpl implements RobotInformationService { /** * 设置状态和信息 + * * @param v */ private void setMsgAndRobotStatus(RobotInformationPageRespVO v) { - String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC +v.getMacAddress(); + String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + v.getMacAddress(); Object object = redisUtil.get(pose2dKey); - RobotStatusDataPoseDTO robotStatusDataPoseDTO= JSONUtil.toBean((String)object, RobotStatusDataPoseDTO.class); + RobotStatusDataPoseDTO robotStatusDataPoseDTO = JSONUtil.toBean((String) object, RobotStatusDataPoseDTO.class); - String robotDoingActionKey = RobotTaskChcheConstant.ROBOT_QUERY_DOING_ACTION +v.getMacAddress(); + String robotDoingActionKey = RobotTaskChcheConstant.ROBOT_QUERY_DOING_ACTION + v.getMacAddress(); Object action = redisUtil.get(robotDoingActionKey); if (ObjectUtil.isNotEmpty(object) && ObjectUtil.isNotEmpty(robotStatusDataPoseDTO)) { @@ -181,10 +178,10 @@ public class RobotInformationServiceImpl implements RobotInformationService { if (RobotTaskModelEnum.REJECTION.getType().equals(v.getRobotTaskModel())) { v.setRobotStatus(RobotInformationPageStatusEnum.DOLOCK.getType()); v.setMsg("车辆已经锁定"); - }else if (ObjectUtil.isEmpty(object)) { + } else if (ObjectUtil.isEmpty(object)) { v.setRobotStatus(RobotInformationPageStatusEnum.OFFLINE.getType()); v.setMsg("车辆已经离线"); - }else if (RobotStatusEnum.STAND_BY.getType().equals(v.getRobotStatus())) { + } else if (RobotStatusEnum.STAND_BY.getType().equals(v.getRobotStatus())) { //查看机器人最后做的任务是不是充电 RobotTaskDetailDO robotTaskDetailDO = taskDetailMapper.selectOne(new LambdaQueryWrapper() .eq(RobotTaskDetailDO::getRobotNo, v.getRobotNo()) @@ -195,15 +192,15 @@ public class RobotInformationServiceImpl implements RobotInformationService { && RobotTaskStatusEnum.DOING.getType().equals(robotTaskDetailDO.getTaskStatus())) { v.setRobotStatus(RobotInformationPageStatusEnum.CHARGE.getType()); v.setMsg("车辆正在充电"); - }else { + } else { v.setRobotStatus(RobotInformationPageStatusEnum.STANDBY.getType()); v.setMsg("车辆正在待命"); } - }else if (RobotStatusEnum.DOING.getType().equals(v.getRobotStatus()) && ObjectUtil.isNotEmpty(action)) { + } else if (RobotStatusEnum.DOING.getType().equals(v.getRobotStatus()) && ObjectUtil.isNotEmpty(action)) { v.setRobotStatus(RobotInformationPageStatusEnum.INTASK.getType()); CommandTypeEnum commandType = CommandTypeEnum.getCommandType(String.valueOf(action)); if (ObjectUtil.isNotEmpty(commandType)) { - v.setMsg("车辆正在"+commandType.getMsg()); + v.setMsg("车辆正在" + commandType.getMsg()); } } else { v.setRobotStatus(RobotInformationPageStatusEnum.FAULT.getType()); @@ -214,6 +211,7 @@ public class RobotInformationServiceImpl implements RobotInformationService { /** * 统计车辆待命/任务中/离线 + * * @return */ @Override @@ -233,13 +231,13 @@ public class RobotInformationServiceImpl implements RobotInformationService { Integer fault = 0; //0:待命、1:任务中、2:锁定、3:离线、4:充电中、5:故障 for (RobotInformationDO v : existRobot) { - String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC +v.getMacAddress(); + String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + v.getMacAddress(); Object object = redisUtil.get(pose2dKey); if (ObjectUtil.isEmpty(object)) { offline++; - }else if (RobotTaskModelEnum.REJECTION.getType().equals(v.getRobotTaskModel())) { + } else if (RobotTaskModelEnum.REJECTION.getType().equals(v.getRobotTaskModel())) { doLock++; - }else if (RobotStatusEnum.STAND_BY.getType().equals(v.getRobotStatus())) { + } else if (RobotStatusEnum.STAND_BY.getType().equals(v.getRobotStatus())) { //查看机器人最后做的任务是不是充电 RobotTaskDetailDO robotTaskDetailDO = taskDetailMapper.selectOne(new LambdaQueryWrapper() @@ -250,11 +248,11 @@ public class RobotInformationServiceImpl implements RobotInformationService { && RobotTaskTypeEnum.CHARGE.getType().equals(robotTaskDetailDO.getTaskType()) && RobotTaskStatusEnum.DOING.getType().equals(robotTaskDetailDO.getTaskStatus())) { charge++; - }else { + } else { standby++; } - }else if (RobotStatusEnum.DOING.getType().equals(v.getRobotStatus())) { + } else if (RobotStatusEnum.DOING.getType().equals(v.getRobotStatus())) { inTask++; } else { fault++; @@ -271,7 +269,6 @@ public class RobotInformationServiceImpl implements RobotInformationService { } /** - * * @return */ @Override @@ -289,6 +286,7 @@ public class RobotInformationServiceImpl implements RobotInformationService { /** * 根据mac查询机器人编号 + * * @param mac * @return */ @@ -307,29 +305,10 @@ public class RobotInformationServiceImpl implements RobotInformationService { .eq(RobotInformationDO::getMacAddress, mac) .last("limit 1")); if (ObjectUtil.isNotEmpty(robotInformationDO)) { - redisUtil.set(RobotTaskChcheConstant.ROBOT_GET_ROBOTNO_BY_MAC + mac,robotInformationDO.getRobotNo()); + redisUtil.set(RobotTaskChcheConstant.ROBOT_GET_ROBOTNO_BY_MAC + mac, robotInformationDO.getRobotNo()); return robotInformationDO.getRobotNo(); } return ""; } - @Override - public void test(RobotStatusDTO robotStatusDataDTO) { - TenantContextHolder.setTenantId(1L); - if (ObjectUtil.isEmpty(robotStatusDataDTO) || ObjectUtil.isEmpty(robotStatusDataDTO.getMac())) { - return; - } - RobotStatusDataPoseDTO robotStatusDataPoseDTO = new RobotStatusDataPoseDTO(); - robotStatusDataPoseDTO.setX(robotStatusDataDTO.getData().getPose2d().getX()); - robotStatusDataPoseDTO.setY(robotStatusDataDTO.getData().getPose2d().getY()); - robotStatusDataPoseDTO.setYaw(robotStatusDataDTO.getData().getPose2d().getYaw()); - robotStatusDataPoseDTO.setFloor(robotStatusDataDTO.getData().getFloor_zone().getFloor()); - robotStatusDataPoseDTO.setArea(robotStatusDataDTO.getData().getFloor_zone().getArea()); - robotStatusDataPoseDTO.setBat_soc(robotStatusDataDTO.getData().getPose2d().getBat_soc()); - // 模拟请求 - processor.handleRequest(robotStatusDataDTO.getData().getFloor_zone().getFloor() + "_" + robotStatusDataDTO.getData().getFloor_zone().getArea(), - robotStatusDataDTO.getMac(), JSONUtil.toJsonStr(robotStatusDataPoseDTO)); - - } - } From a326ac143f69f54227d5a0ea13bcd5c7dc107cfb Mon Sep 17 00:00:00 2001 From: aikai Date: Fri, 14 Feb 2025 11:52:28 +0800 Subject: [PATCH 5/5] =?UTF-8?q?refactor(robot):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=9C=BA=E5=99=A8=E4=BA=BA=E7=8A=B6=E6=80=81=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入 RobotStatisticsTypeEnum 枚举类,用于机器人统计类型 - 添加 ArrayList 导入,用于数据处理- 修改 RobotStatusApiImpl 中的数据处理逻辑,优化数据合并和请求处理 --- .../yudao/module/system/api/robot/RobotStatusApiImpl.java | 2 +- .../system/service/robot/RobotInformationServiceImpl.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java index c34b864c9..ddce2ea79 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotStatusApiImpl.java @@ -87,7 +87,7 @@ public class RobotStatusApiImpl implements RobotStatusApi { robotStatusDataPoseDTO.setArea(robotStatusDataDTO.getData().getFloor_zone().getArea()); redisUtil.set(pose2dKey, JSON.toJSONString(robotStatusDataPoseDTO), robotPositionCacheTime); - // 模拟请求 + // 合并请求 - 这里接受到的数据都丢给 RequestProcessor - 再整合数据通过WebSocket丢给前端 processor.handleRequest(robotStatusDataPoseDTO.getFloor() + "_" + robotStatusDataPoseDTO.getArea(), robotStatusDataDTO.getMac(), JSONUtil.toJsonStr(robotStatusDataDTO.getData().getPose2d())); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java index 742c1433d..7c5c9c599 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java @@ -17,12 +17,14 @@ import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotInformationMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotModelMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper; import cn.iocoder.yudao.module.system.enums.robot.*; +import cn.iocoder.yudao.module.system.enums.robot.information.RobotStatisticsTypeEnum; import cn.iocoder.yudao.module.system.util.redis.RedisUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; import java.util.Set;