diff --git a/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/PathPlanningApi.java b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/PathPlanningApi.java index 8961ea493..017934428 100644 --- a/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/PathPlanningApi.java +++ b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/PathPlanningApi.java @@ -17,7 +17,7 @@ import java.util.List; public interface PathPlanningApi { String PREFIX = ApiConstants.PREFIX + "/config"; - @PostMapping(PREFIX + "/synchronousPoint") + /*@PostMapping(PREFIX + "/synchronousPoint") @Operation(summary = "同步ware_position_map_line的点位信息") void synchronousPointToPP(@RequestBody PositionMapLinePathDTO relatedPathNode, @RequestParam("topic") String topic); @@ -28,5 +28,5 @@ public interface PathPlanningApi { @PostMapping(PREFIX + "/synchronousLineObject") @Operation(summary = "同步Object信息给PP") - void synchronousLineObject(@RequestBody Object obj, @RequestParam("topic") String topic); + void synchronousLineObject(@RequestBody Object obj, @RequestParam("topic") String topic);*/ } diff --git a/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotArgDTO.java b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotArgDTO.java new file mode 100644 index 000000000..21f27c839 --- /dev/null +++ b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotArgDTO.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.module.mqtt.api.path.dto; + +import lombok.Data; + +@Data +public class PathToRobotArgDTO { + private Long floor; + private String areaId; + private String mapName; + private String poseId; + private PathToRobotArgPoseDTO pose2d; + +} diff --git a/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotArgPoseDTO.java b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotArgPoseDTO.java new file mode 100644 index 000000000..55de6598c --- /dev/null +++ b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotArgPoseDTO.java @@ -0,0 +1,12 @@ +package cn.iocoder.yudao.module.mqtt.api.path.dto; + +import lombok.Data; + +@Data +public class PathToRobotArgPoseDTO { + private Double x; + + private Double y; + + private Double yaw; +} diff --git a/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotDTO.java b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotDTO.java new file mode 100644 index 000000000..fcd675e58 --- /dev/null +++ b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotDTO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.mqtt.api.path.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PathToRobotDTO { + + //这个实体类的信息,不能修改 + //这个实体类的信息,不能修改 + //这个实体类的信息,不能修改 + //这个实体类的信息,不能修改 + //这个实体类的信息,不能修改 + //这个实体类的信息,不能修改 + private String orderType; + private Integer isCommandEnd; + private String robotNo; + private String commandType; + private PathToRobotArgDTO arg; +} diff --git a/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/task/RobotTaskApi.java b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/task/RobotTaskApi.java index f926fbb56..79dbc8130 100644 --- a/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/task/RobotTaskApi.java +++ b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/task/RobotTaskApi.java @@ -18,7 +18,7 @@ public interface RobotTaskApi { String PREFIX = ApiConstants.PREFIX + "/config"; - @PostMapping(PREFIX + "/distribute/tasks") + /*@PostMapping(PREFIX + "/distribute/tasks") @Operation(summary = "下发任务给车机") - void sendTaskToRobot(@Valid @RequestBody List robotTaskDOS ); + void sendTaskToRobot(@Valid @RequestBody List robotTaskDOS );*/ } diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/api/robot/RemoteControllerProcessor.java b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/api/robot/RemoteControllerProcessor.java index 2186ca53f..c967e24b2 100644 --- a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/api/robot/RemoteControllerProcessor.java +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/api/robot/RemoteControllerProcessor.java @@ -55,7 +55,7 @@ public class RemoteControllerProcessor { public void addCache(RemoteRobotTransferDTO dto) { RemoteControllerSocketDTO remoteControllerSocketDTO = cache.get(remoteControllerIp); - log.info("缓存的数据 :{}", JSON.toJSONString(remoteControllerSocketDTO)); + log.info("是否为空 :{}",ObjectUtil.isEmpty(remoteControllerSocketDTO)); if (ObjectUtil.isNotEmpty(remoteControllerSocketDTO)) { try { Socket socket = remoteControllerSocketDTO.getSocket(); @@ -108,7 +108,7 @@ public class RemoteControllerProcessor { String portHex = Integer.toHexString(dto.getRobotPort().intValue()); String portHexOne = portHex.substring(0, 2); String portHexTwo = portHex.substring(2); - msg = msg + " " + portHexOne + " " + portHexTwo; + msg = msg + " " + portHexTwo + " " + portHexOne; if (cockpitTimeOut > 0) { msg = msg + " " + ONE + " " + Integer.toHexString(cockpitTimeOut); } else { diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/controller/admin/robot/dto/RemoteRobotChangeModeDTO.java b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/controller/admin/robot/dto/RemoteRobotChangeModeDTO.java index fd3cd0ee9..187682cdd 100644 --- a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/controller/admin/robot/dto/RemoteRobotChangeModeDTO.java +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/controller/admin/robot/dto/RemoteRobotChangeModeDTO.java @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.remote.controller.admin.robot.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -10,6 +12,8 @@ import javax.validation.constraints.NotNull; public class RemoteRobotChangeModeDTO { @Schema(description = "远遥模式(0:自动模式, 1:手动模式, 2:自由模式)") @NotNull(message = "请选择远遥模式") + @Max(value = 2,message = "请选择远遥模式") + @Min(value = 0,message = "请选择远遥模式") private Integer remoteMode = 0; @Schema(description = "车辆编号") diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/service/robot/RemoteRobotServiceImpl.java b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/service/robot/RemoteRobotServiceImpl.java index ef7eeac34..785bab137 100644 --- a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/service/robot/RemoteRobotServiceImpl.java +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/service/robot/RemoteRobotServiceImpl.java @@ -204,8 +204,8 @@ public class RemoteRobotServiceImpl implements RemoteRobotService { RobotDistanceInformationDTO build = RobotDistanceInformationDTO.builder().linearSpeed(floorZone.getLinearSpeed()).robotNo(data.getRobotNo()) .endDistance(data.getEndDistance()).nextRadian(data.getNextRadian()).message(msg).build(); - processor.handleRequest(floorZone.getFloor() + "_" + floorZone.getArea(), - mac, JSONUtil.toJsonStr(build)); + /*processor.handleRequest(floorZone.getFloor() + "_" + floorZone.getArea(), + mac, JSONUtil.toJsonStr(build));*/ } /** diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/service/speed/RemoteRobotMaxSpeedServiceImpl.java b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/service/speed/RemoteRobotMaxSpeedServiceImpl.java index 8aade9c26..ec6b69c65 100644 --- a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/service/speed/RemoteRobotMaxSpeedServiceImpl.java +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/service/speed/RemoteRobotMaxSpeedServiceImpl.java @@ -1,14 +1,20 @@ package cn.iocoder.yudao.module.remote.service.speed; +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.module.system.api.remote.RemoteRobotMaxSpeedApi; import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotMaxSpeedDTO; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Collections; import java.util.List; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; + @Slf4j @Service public class RemoteRobotMaxSpeedServiceImpl implements RemoteRobotMaxSpeedService{ @@ -16,6 +22,9 @@ public class RemoteRobotMaxSpeedServiceImpl implements RemoteRobotMaxSpeedServic @Resource private RemoteRobotMaxSpeedApi remoteRobotMaxSpeedApi; + @Value("${remote.robot-max-speed:5}") + private int robotMaxSpeed; + @Override public List getRobotMaxSpeedPage() { return remoteRobotMaxSpeedApi.getRobotMaxSpeedPage(); @@ -23,6 +32,15 @@ public class RemoteRobotMaxSpeedServiceImpl implements RemoteRobotMaxSpeedServic @Override public void updateRobotMaxSpeedPage(List list) { + for (RemoteRobotMaxSpeedDTO remoteRobotMaxSpeedDTO : list) { + int speed = ObjectUtil.isEmpty(remoteRobotMaxSpeedDTO.getMaxSpeed()) ? 0 : Integer.parseInt(remoteRobotMaxSpeedDTO.getMaxSpeed()); + if (speed <= 0) { + throw exception(REMOTE_ROBOT_SPEED_EMPTY); + }else if (speed > robotMaxSpeed) { + String str = REMOTE_ROBOT_MAX_SPEED_LIMIT.getMsg() + " 最大限速为 " +robotMaxSpeed +" m/s"; + throw exception0(REMOTE_ROBOT_MAX_SPEED_LIMIT.getCode(),str); + } + } remoteRobotMaxSpeedApi.updateRobotMaxSpeedPage(list); } diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-dev.yaml b/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-dev.yaml index ab71ccb74..e4fef5258 100644 --- a/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-dev.yaml +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-dev.yaml @@ -58,4 +58,5 @@ remote: msg: AA 55 13 04 01 88 88 # 驾舱socket头信息 cockpit-time-out: 120 # 驾舱超时报警时间 industrial-control-time-out: 120 # 工控通信超时报警时间 - robot-communication-time-out: 120 # 车辆通信超时报警时间 \ No newline at end of file + robot-communication-time-out: 120 # 车辆通信超时报警时间 + robot-max-speed: 5 # 远遥控制车辆最大速度 m/s \ No newline at end of file diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-local.yaml b/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-local.yaml index b91a5e505..d76de0aa5 100644 --- a/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-local.yaml +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-local.yaml @@ -59,4 +59,5 @@ remote: cockpit-time-out: 120 # 驾舱超时报警时间 industrial-control-time-out: 120 # 工控通信超时报警时间 robot-communication-time-out: 120 # 车辆通信超时报警时间 + robot-max-speed: 5 # 远遥控制车辆最大速度 m/s diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-test.yaml b/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-test.yaml index 947e1e3f6..ac3799d90 100644 --- a/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-test.yaml +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/resources/application-test.yaml @@ -39,4 +39,5 @@ remote: msg: AA 55 13 04 01 88 88 # 驾舱socket头信息 cockpit-time-out: 120 # 驾舱超时报警时间 industrial-control-time-out: 120 # 工控通信超时报警时间 - robot-communication-time-out: 120 # 车辆通信超时报警时间 \ No newline at end of file + robot-communication-time-out: 120 # 车辆通信超时报警时间 + robot-max-speed: 5 # 远遥控制车辆最大速度 m/s \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/RobotStatusDataErrorDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/RobotStatusDataErrorDTO.java index 880ab6a3a..df538ccb4 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/RobotStatusDataErrorDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/robot/dto/RobotStatusDataErrorDTO.java @@ -11,8 +11,5 @@ public class RobotStatusDataErrorDTO { * 错误码 */ public String errorCode; - /** - * 错误等级 - */ - public String codeLevel; + } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 2f0159498..34d65d9a5 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -301,6 +301,10 @@ public interface ErrorCodeConstants { ErrorCode REMOTE_ROBOT_CONNECT_FAIL = new ErrorCode(1_002_053_017, "与远遥工控机连接失败"); ErrorCode REMOTE_TRANSFER_NOT_SAME_ROBOT = new ErrorCode(1_002_053_018, "任务转移车辆与发生异常的车辆,不能是同一台车"); ErrorCode REMOTE_ROBOT_HAVE_TASK = new ErrorCode(1_002_053_019, "此车辆有处理中的任务,不能进行任务转移。请选择其他车辆"); + ErrorCode REMOTE_ROBOT_SPEED_EMPTY = new ErrorCode(1_002_053_020, "车辆速度必须大于0m/s"); + ErrorCode REMOTE_ROBOT_MAX_SPEED_LIMIT = new ErrorCode(1_002_053_021, "车辆速度超过最大速度限制"); + ErrorCode REMOTE_NOT_HAVE_SPEED = new ErrorCode(1_002_053_022, "查询不到车辆速度信息"); + ErrorCode REMOTE_SPEED_MORE_THAN_ZERO = new ErrorCode(1_002_053_023, "车辆未停稳"); // ========== 车辆摄像头信息 1_002_054_001 ========== ErrorCode CAMERA_NOT_EXISTS = new ErrorCode(1_002_054_001, "车辆摄像头信息不存在"); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotReactiveStatusApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotReactiveStatusApiImpl.java index d3ff5c433..475fe2ad9 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotReactiveStatusApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotReactiveStatusApiImpl.java @@ -30,10 +30,8 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; @Slf4j @@ -65,6 +63,7 @@ public class RobotReactiveStatusApiImpl implements RobotReactiveStatusApi { @Override public void robotReactiveStatus(String message) { TenantContextHolder.setTenantId(1L); + log.info("切换地图 :{}",message); RobotReactiveStatusDTO data = JSON.parseObject(message, RobotReactiveStatusDTO.class); String floorAreaKey = RobotTaskChcheConstant.ROBOT_FLOOR_AREA + data.getMac(); String robotNo = robotInformationService.getRobotNoByMac(data.getMac()); @@ -87,6 +86,9 @@ public class RobotReactiveStatusApiImpl implements RobotReactiveStatusApi { map.put(robotNo,value); redisUtil.hmset(value,map); + String speedKey = RobotTaskChcheConstant.ROBOT_SPEED_FORK_HEIGHT + robotNo; + redisUtil.set(speedKey, message); + // -- get 老的数据 - 看有没有 - 有的话 - 对比下 - 如果相同 - 更新hashMap中key的value // - 如果不相同的话 - 更新当前redis数据 - 然后 - 根据老的数据 去 hashMapRedis 中删除 这个key的数据 // - 然后插入到 对应的区域的hashMap中 @@ -110,46 +112,41 @@ public class RobotReactiveStatusApiImpl implements RobotReactiveStatusApi { private void addRobotErrorMsg(RobotReactiveStatusDTO data) { String robotNo = robotInformationService.getRobotNoByMac(data.getMac()); List errCode = data.getErrCode(); - List warnCodes = - errCode.stream().map(RobotStatusDataErrorDTO::getErrorCode).collect(Collectors.toList()); + Set warnCodes = + errCode.stream().map(RobotStatusDataErrorDTO::getErrorCode).collect(Collectors.toSet()); List robotWarnCodeMappingDOS = warnCodeMappingMapper.selectList(new LambdaQueryWrapper() .in(RobotWarnCodeMappingDO::getWarnCode, warnCodes)); if (ObjectUtil.isEmpty(robotWarnCodeMappingDOS)) { - log.info("查不对应编号的告警信息 :{}", JSON.toJSONString(warnCodes)); + log.info("查不对应编号的告警信息 :{}", JSON.toJSONString(data)); return; } - Map> warnCodeMapping = - robotWarnCodeMappingDOS.stream().collect(Collectors.groupingBy(RobotWarnCodeMappingDO::getWarnCode)); + Map warnCodeMapping = + robotWarnCodeMappingDOS.stream().collect(Collectors.toMap(RobotWarnCodeMappingDO::getWarnCode, Function.identity())); List warnMsgDOS = new ArrayList<>(); //机器人异常等级 String errorLevelKey = RobotTaskChcheConstant.ROBOT_ERROR_LEVEL + data.getMac(); - Object errorLevel = redisUtil.get(errorLevelKey); String errorMsgKey = RobotTaskChcheConstant.ROBOT_ERROR_MSG + data.getMac(); - Object errorMsg = redisUtil.get(errorMsgKey); - - Integer level = ObjectUtil.isEmpty(errorLevel) ? 0 : Integer.valueOf(errorLevel.toString()); - RobotTaskDetailActionLogDO lastTaskByRobotNo = taskDetailActionLogService.getLastTaskByRobotNo(robotNo); + int level = 0; String msg = ""; - int i = 0; for (RobotStatusDataErrorDTO robotStatusData : errCode) { - List mappingDOS = warnCodeMapping.get(robotStatusData.getErrorCode()); + RobotWarnCodeMappingDO mappingDOS = warnCodeMapping.get(robotStatusData.getErrorCode()); if (ObjectUtil.isEmpty(mappingDOS)) { log.info("当前告警类型查不到对应的告警信息 :{}", robotStatusData.getErrorCode()); continue; } - RobotWarnMsgDO warnMsg = RobotWarnMsgDO.builder().warnLevel(Integer.valueOf(robotStatusData.getCodeLevel())) + RobotWarnMsgDO warnMsg = RobotWarnMsgDO.builder().warnLevel(mappingDOS.getWarnLevel()) .warnCode(robotStatusData.getErrorCode()) .robotNo(robotNo) .warnType(RobotWarnType.ROBOT_WARN.getType()) - .warnMsg(robotNo + "_" + mappingDOS.get(0).getWarnMsg()) - .warnSolve(mappingDOS.get(0).getWarnSolve()) + .warnMsg(robotNo + "_" + mappingDOS.getWarnMsg()) + .warnSolve(mappingDOS.getWarnSolve()) .build(); if (ObjectUtil.isNotEmpty(lastTaskByRobotNo) && ActionStatusEnum.DOING.getType().equals(lastTaskByRobotNo.getActionStatus())) { @@ -159,20 +156,16 @@ public class RobotReactiveStatusApiImpl implements RobotReactiveStatusApi { warnMsgDOS.add(warnMsg); - if (level.intValue() < Integer.valueOf(robotStatusData.getCodeLevel()).intValue()) { - level = Integer.valueOf(robotStatusData.getCodeLevel()); - errorMsg = warnMsg.getWarnMsg(); - } - if (i < Integer.valueOf(robotStatusData.getCodeLevel()).intValue()) { - i = Integer.valueOf(robotStatusData.getCodeLevel()); + if (level < mappingDOS.getWarnLevel()) { + level = mappingDOS.getWarnLevel(); msg = warnMsg.getWarnMsg(); } } redisUtil.set(errorLevelKey, level); - redisUtil.set(errorMsgKey, errorMsg); + redisUtil.set(errorMsgKey, msg); if (ObjectUtil.isNotEmpty(lastTaskByRobotNo) && ActionStatusEnum.DOING.getType().equals(lastTaskByRobotNo.getActionStatus()) - && 4 == i && ObjectUtil.isNotEmpty(lastTaskByRobotNo.getTaskDetailId())) { + && 4 == level && ObjectUtil.isNotEmpty(lastTaskByRobotNo.getTaskDetailId())) { taskDetailService.setTaskDetailError(lastTaskByRobotNo.getTaskDetailId()); } 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 d2bfed1fe..6fc6e2b48 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,7 +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.mqtt.api.path.PathPlanningApi; +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.vo.RobotInformationVO; import cn.iocoder.yudao.module.system.config.ratelimiter.SystemRateLimiter; @@ -39,12 +39,12 @@ public class RobotStatusApiImpl implements RobotStatusApi { @Resource private RequestProcessor processor; - @Resource - private PathPlanningApi pathPlanningApi; - @Autowired private ThreadPoolTaskExecutor taskExecutor; + @Resource + private CommonApi commonApi; + /** * 更新机器人点位/异常/能否做任务 * @@ -107,7 +107,7 @@ public class RobotStatusApiImpl implements RobotStatusApi { private void sendToPP(RobotStatusDataPoseDTO robotStatusDataPoseDTO) { taskExecutor.execute(()->{ - pathPlanningApi.synchronousLineObject(robotStatusDataPoseDTO, PathPlanningTopicConstant.AGV_POSE); + commonApi.commonMethod(robotStatusDataPoseDTO, PathPlanningTopicConstant.AGV_POSE); }); } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotTaskChcheConstant.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotTaskChcheConstant.java index a51878173..ee434b53c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotTaskChcheConstant.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotTaskChcheConstant.java @@ -38,15 +38,9 @@ public class RobotTaskChcheConstant { //机器人mac地址和机器人id以及机器人类型映射(通过mac地址。获取机器人基本信息) public static String ROBOT_GET_ROBOT_INFO = "robot:information:getRobotInfo"; - //机器人正在做的任务整体信息(拼接common_id) -// public static String ROBOT_ACTION_LOG_ENTITY = "robot:action:log:entity"; - - //机器人取货完成(拼接robot_task_detail的id) -// public static String ROBOT_ACTION_TAKE_GOODS = "robot:take:"; - - //机器人放货完成(拼接robot_task_detail的id) -// public static String ROBOT_ACTION_RELEASE_GOODS = "robot:release:"; - //机器人点位 public static String ROBOT_ADDRESS = "robot:information:address"; + + //机器人速度和货叉高度 (拼接的是车辆编号robotNo) + public static String ROBOT_SPEED_FORK_HEIGHT = "robot:speed:fork:height"; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailSaveReqVO.java index f702ff832..4a090dc0e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailSaveReqVO.java @@ -97,4 +97,10 @@ public class RobotTaskDetailSaveReqVO { @Schema(description = "是否发生异常(0:正常、1:异常)") private Integer occurError; + @Schema(description = "是否人工干预(0:未干预、1:RCS关闭、2:RCS人工完成、3:远遥取货完成、4:远遥任务完成、5:远遥取货完成和远遥任务完成)") + private Integer manualIntervention; + + @Schema(description = "人工干预时间") + private LocalDateTime manualInterventionTime; + } \ 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/statistics/StatisticsController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/statistics/StatisticsController.java new file mode 100644 index 000000000..316269413 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/statistics/StatisticsController.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.system.controller.admin.statistics; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.system.controller.admin.statistics.vo.RobotStatusClassificationDTO; +import cn.iocoder.yudao.module.system.service.robot.RobotInformationService; +import io.swagger.v3.oas.annotations.Operation; +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.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 统计") +@RestController +@RequestMapping("/system/statistics") +@Validated +public class StatisticsController { + + @Resource + private RobotInformationService informationService; + + @PostMapping("/robotStatusClassification") + @Operation(summary = "统计车辆状态分类") + @PreAuthorize("@ss.hasPermission('robot:information:robotStatusClassification')") + public CommonResult robotStatusClassification() { + return success(informationService.robotStatusClassification()); + } + + + + + + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/statistics/vo/RobotStatusClassificationDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/statistics/vo/RobotStatusClassificationDTO.java new file mode 100644 index 000000000..44e3691f6 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/statistics/vo/RobotStatusClassificationDTO.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.system.controller.admin.statistics.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class RobotStatusClassificationDTO { + + @Schema(description = "空闲车辆百分比") + private Integer idle ; + + @Schema(description = "空闲车辆数量") + private Integer idleNum = 0; + + @Schema(description = "执行任务车辆百分比") + private Integer doingTask; + + @Schema(description = "执行任务车辆数量") + private Integer doingTaskNum = 0; + + @Schema(description = "充电车辆百分比") + private Integer charge ; + + @Schema(description = "充电车辆数量") + private Integer chargeNum = 0; + + @Schema(description = "故障车辆百分比") + private Integer fault; + + @Schema(description = "故障车辆数量") + private Integer faultNum = 0; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningServiceImpl.java index 367864bad..8b110432b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningServiceImpl.java @@ -5,7 +5,6 @@ import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi; import cn.iocoder.yudao.module.mqtt.api.common.CommonApi; -import cn.iocoder.yudao.module.mqtt.api.path.PathPlanningApi; import cn.iocoder.yudao.module.mqtt.api.path.dto.*; import cn.iocoder.yudao.module.mqtt.api.path.task.TaskPathPlanningDTO; import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO; @@ -72,11 +71,6 @@ public class PathPlanningServiceImpl implements PathPlanningService { @Resource private PositionMapMapper positionMapMapper; -// public static ExecutorService executor = Executors.newFixedThreadPool(5); - - @Resource - private PathPlanningApi pathPlanningApi; - @Resource private PositionMapItemMapper positionMapItemMapper; @@ -150,7 +144,7 @@ public class PathPlanningServiceImpl implements PathPlanningService { assembleDataToPP(relatedPathNode, positionMapLineDOS); } - pathPlanningApi.synchronousLineObject(new PositionMapLineDTO(), PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_LINE_END); + commonApi.commonMethod(new PositionMapLineDTO(), PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_LINE_END); } /** @@ -181,7 +175,7 @@ public class PathPlanningServiceImpl implements PathPlanningService { relatedPathNode.setControl_nodes(positionMapItemSynDTOS); log.info("synchronousAllItem----doing"); - pathPlanningApi.synchronousLineObject(relatedPathNode, PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_NODE); + commonApi.commonMethod(relatedPathNode, PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_NODE); } log.info("synchronousAllItem----end"); @@ -230,7 +224,7 @@ public class PathPlanningServiceImpl implements PathPlanningService { relatedPathNode.setArea(positionMapDO.getArea()); relatedPathNode.setControl_nodes(list); - pathPlanningApi.synchronousLineObject(relatedPathNode, PathPlanningTopicConstant.ADD_MAP_LINE); + commonApi.commonMethod(relatedPathNode, PathPlanningTopicConstant.ADD_MAP_LINE); } /** @@ -260,7 +254,7 @@ public class PathPlanningServiceImpl implements PathPlanningService { ids.add(data.getId()); relatedPathNode.setIds(ids); - pathPlanningApi.synchronousLineObject(relatedPathNode, PathPlanningTopicConstant.DELETE_MAP_LINE); + commonApi.commonMethod(relatedPathNode, PathPlanningTopicConstant.DELETE_MAP_LINE); } @@ -308,7 +302,7 @@ public class PathPlanningServiceImpl implements PathPlanningService { relatedPathNode.setType(PathTypeEnum.UPDATE.getType()); relatedPathNode.setControl_nodes(list); - pathPlanningApi.synchronousLineObject(relatedPathNode, PathPlanningTopicConstant.UPDATE_MAP_LINE); + commonApi.commonMethod(relatedPathNode, PathPlanningTopicConstant.UPDATE_MAP_LINE); } /** @@ -350,7 +344,7 @@ public class PathPlanningServiceImpl implements PathPlanningService { PositionMapItemPathDTO.setType(PathTypeEnum.ADD.getType()); PositionMapItemPathDTO.setControl_nodes(Arrays.asList(build)); - pathPlanningApi.synchronousLineObject(PositionMapItemPathDTO, PathPlanningTopicConstant.ADD_MAP_NODE); + commonApi.commonMethod(PositionMapItemPathDTO, PathPlanningTopicConstant.ADD_MAP_NODE); } /** @@ -384,7 +378,7 @@ public class PathPlanningServiceImpl implements PathPlanningService { PositionMapItemPathDTO.setType(PathTypeEnum.DELETE.getType()); PositionMapItemPathDTO.setIds(Arrays.asList(data.getId())); - pathPlanningApi.synchronousLineObject(PositionMapItemPathDTO, PathPlanningTopicConstant.DELETE_MAP_NODE); + commonApi.commonMethod(PositionMapItemPathDTO, PathPlanningTopicConstant.DELETE_MAP_NODE); } @Override @@ -421,13 +415,13 @@ public class PathPlanningServiceImpl implements PathPlanningService { PositionMapItemPathDTO.setType(PathTypeEnum.UPDATE.getType()); PositionMapItemPathDTO.setControl_nodes(Arrays.asList(build)); - pathPlanningApi.synchronousLineObject(PositionMapItemPathDTO, PathPlanningTopicConstant.UPDATE_MAP_NODE); + commonApi.commonMethod(PositionMapItemPathDTO, PathPlanningTopicConstant.UPDATE_MAP_NODE); } @Override public void robotDimensions() { List list = informationMapper.selectRobotDimensions(); - pathPlanningApi.synchronousLineObject(list, PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS); + commonApi.commonMethod(list, PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS); } /** @@ -437,12 +431,16 @@ public class PathPlanningServiceImpl implements PathPlanningService { */ @Override public void sendPosedsToRobot(String message) { - PathPosedsDTO pathPosedsDTO = JSON.parseObject(message, PathPosedsDTO.class); - String mac = robotInformationService.getMacByRobotNo(pathPosedsDTO.getRobotNo()); + PathToRobotDTO pathRobotDTO = JSON.parseObject(message, PathToRobotDTO.class); + String mac = robotInformationService.getMacByRobotNo(pathRobotDTO.getRobotNo()); String topic = RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC + mac; - commonApi.commonMethodStr(message, topic); - if(RobotCommandTypeEnum.SWITCH_MAP.getType().equals(pathPosedsDTO.getCommandType())) { - controllerInformationService.robotChangeSpeed(pathPosedsDTO); + if(RobotCommandTypeEnum.SWITCH_MAP.getType().equals(pathRobotDTO.getCommandType())) { + String mapFileName = positionMapService.getMapFileNameByFloorAndAreaName(pathRobotDTO.getArg().getFloor(),pathRobotDTO.getArg().getAreaId()); + pathRobotDTO.getArg().setMapName(mapFileName); + controllerInformationService.robotChangeSpeed(pathRobotDTO); + commonApi.commonMethodStr(JSON.toJSONString(pathRobotDTO), topic); + }else { + commonApi.commonMethodStr(message, topic); } } @@ -632,7 +630,7 @@ public class PathPlanningServiceImpl implements PathPlanningService { relatedPathNode.setControl_nodes(list); - pathPlanningApi.synchronousPointToPP(relatedPathNode, PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_LINE); + commonApi.commonMethod(relatedPathNode, PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_LINE); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapService.java index 6ab979ec8..f811e8e22 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapService.java @@ -117,4 +117,12 @@ public interface PositionMapService extends IService { * @return */ List getRemoteAreaRobotByMapId(Long mapId); + + /** + * 获取地图的文件名 + * @param floor + * @param areaId + * @return + */ + String getMapFileNameByFloorAndAreaName(Long floor, String areaId); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapServiceImpl.java index 7e8ba2354..50f9234a7 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapServiceImpl.java @@ -478,6 +478,32 @@ public class PositionMapServiceImpl extends ServiceImpl() + .eq(PositionMapDO::getFloor, floor) + .eq(PositionMapDO::getArea, area) + .last("limit 1")); + if (ObjectUtil.isEmpty(positionMapDO)) { + return null; + } + String pngUrl = positionMapDO.getPngUrl(); + int startOne = pngUrl.lastIndexOf("\\"); + int startTwo = pngUrl.lastIndexOf("/"); + if (ObjectUtil.isNotEmpty(startTwo)) { + startTwo = startTwo + 1; + } + int start = Math.max(startOne, startTwo); + int end = pngUrl.lastIndexOf("."); + return pngUrl.substring(start, end); + } + private List getRemoteSingleMapInfomation(Map robotMap, List robotNos, Map robotDoingTaskMap, Map remoteMap) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/remote/RemoteControllerInformationService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/remote/RemoteControllerInformationService.java index 93cf0ba0e..d00c5859c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/remote/RemoteControllerInformationService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/remote/RemoteControllerInformationService.java @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.service.remote; import java.util.*; import javax.validation.*; -import cn.iocoder.yudao.module.mqtt.api.path.dto.PathPosedsDTO; +import cn.iocoder.yudao.module.mqtt.api.path.dto.PathToRobotDTO; import cn.iocoder.yudao.module.system.api.remote.dto.LoginCheckDTO; import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotStatusDTO; import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotTransferDTO; @@ -14,7 +14,6 @@ import cn.iocoder.yudao.module.system.dal.dataobject.remote.RemoteControllerInfo import cn.iocoder.yudao.module.system.mq.message.RemoteSendMessage; import com.baomidou.mybatisplus.extension.service.IService; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; /** * 远遥设备信息 Service 接口 @@ -116,7 +115,7 @@ public interface RemoteControllerInformationService extends IService() - .eq(RemoteControllerInformationDO::getRobotNo, pathPosedsDTO.getRobotNo()) + .eq(RemoteControllerInformationDO::getRobotNo, pathRobotDTO.getRobotNo()) .last("limit 1")); if (ObjectUtil.isEmpty(information)) { return; @@ -590,6 +595,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl { * @param updateObj */ void checkIpAndPort(RobotInformationDO updateObj); + + /** + * 统计车辆状态分类 + * @return + */ + RobotStatusClassificationDTO robotStatusClassification(); + } 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 85e48f4a1..62fd3658d 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 @@ -11,7 +11,6 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.module.mqtt.api.common.CommonApi; -import cn.iocoder.yudao.module.mqtt.api.path.PathPlanningApi; import cn.iocoder.yudao.module.mqtt.api.path.dto.RobotDimensionsDTO; import cn.iocoder.yudao.module.mqtt.api.path.task.TaskRobotNoLimittationAreaDTO; import cn.iocoder.yudao.module.mqtt.api.path.task.TaskToPathPlanningDTO; @@ -33,6 +32,7 @@ import cn.iocoder.yudao.module.system.controller.admin.config.vo.CommonConfigVO; import cn.iocoder.yudao.module.system.controller.admin.log.vo.UserOperationLogSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.robot.camera.RobotCameraAddVO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; +import cn.iocoder.yudao.module.system.controller.admin.statistics.vo.RobotStatusClassificationDTO; import cn.iocoder.yudao.module.system.controller.admin.tool.dto.CleanAgvDTO; import cn.iocoder.yudao.module.system.dal.dataobject.config.CommonConfigDO; import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO; @@ -77,6 +77,7 @@ import cn.iocoder.yudao.module.system.util.redis.RedissonUtils; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.extern.slf4j.Slf4j; import org.redisson.api.RLock; import org.springframework.beans.factory.annotation.Autowired; @@ -87,6 +88,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.math.BigDecimal; +import java.text.DecimalFormat; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -153,9 +155,6 @@ public class RobotInformationServiceImpl extends ServiceImpl list = informationMapper.selectRobotDimensions(); - pathPlanningApi.synchronousLineObject(list, PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS); + commonApi.commonMethod(list, PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS); redisUtil.del(key); // 返回 @@ -263,8 +262,65 @@ public class RobotInformationServiceImpl extends ServiceImpl robotInformationDOS = informationMapper.selectList(); + if (ObjectUtil.isEmpty(robotInformationDOS)) { + return null; + } + + int idleNum = 0; + int doingTaskNum = 0; + int chargeNum = 0; + int faultNum = 0; + int total = robotInformationDOS.size(); + + for (RobotInformationDO robotInformation : robotInformationDOS) { + String errorLevelKey = RobotTaskChcheConstant.ROBOT_ERROR_LEVEL + robotInformation.getMacAddress(); + Object errorLevel = redisUtil.get(errorLevelKey); + if (ObjectUtil.isNotEmpty(errorLevel)) { + int level = Integer.parseInt(errorLevel.toString()); + if (level > 3) { + faultNum = faultNum + 1; + continue; + } + } + + if (RobotStatusEnum.STAND_BY.getType().equals(robotInformation.getRobotStatus())) { + idleNum = idleNum + 1; + } else if (RobotStatusEnum.DOING.getType().equals(robotInformation.getRobotStatus())) { + doingTaskNum = doingTaskNum + 1; + } else if (RobotStatusEnum.CHARGE.getType().equals(robotInformation.getRobotStatus())) { + chargeNum = chargeNum + 1; + } + } + + int idle = idleNum * 100 / total; + int doingTask = doingTaskNum * 100 / total; + int charge = chargeNum * 100 / total; + int fault = faultNum * 100 / total; + + return RobotStatusClassificationDTO.builder() + .idle(idle) + .idleNum(idleNum) + .doingTask(doingTask) + .doingTaskNum(doingTaskNum) + .charge(charge) + .chargeNum(chargeNum) + .fault(fault) + .faultNum(faultNum).build(); + } + + + /** * 校验IP地址是否合法 + * * @param ipAddress IP地址字符串 * @return 是否合法 */ @@ -393,7 +449,7 @@ public class RobotInformationServiceImpl extends ServiceImpl RobotDimensions = informationMapper.selectRobotDimensions(); - pathPlanningApi.synchronousLineObject(RobotDimensions, PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS); + commonApi.commonMethod(RobotDimensions, PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS); } @Override @@ -425,7 +481,7 @@ public class RobotInformationServiceImpl extends ServiceImpl RobotDimensions = informationMapper.selectRobotDimensions(); - pathPlanningApi.synchronousLineObject(RobotDimensions, PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS); + commonApi.commonMethod(RobotDimensions, PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS); redisUtil.del(key); //地图相关 @@ -494,7 +550,7 @@ public class RobotInformationServiceImpl extends ServiceImpl pathPlanningList = new ArrayList<>(); pathPlanningList.add(pathPlanning); log.info("任务下发给PP :{}", JSON.toJSONString(pathPlanningList)); - pathPlanningApi.synchronousLineObject(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST); + commonApi.commonMethod(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST); } private void resendToPPData(TaskToPathPlanningDTO pathPlanning, RobotTaskDetailActionLogDO actionLog, RobotInformationDO robotInformationDO, Boolean isRemote) { @@ -1103,9 +1157,9 @@ public class RobotInformationServiceImpl extends ServiceImpl robotNoLimitions = Arrays.asList(taskRobotNoLimittationAreaDTO); pathPlanning.setRobotNoLimitationAreaDTOS(robotNoLimitions); - resendToPPData(pathPlanning, actionLog, robotInformationDO,true); + resendToPPData(pathPlanning, actionLog, robotInformationDO, true); List pathPlanningList = new ArrayList<>(); pathPlanningList.add(pathPlanning); log.info("远遥任务转移, 任务下发给PP :{}", JSON.toJSONString(pathPlanningList)); - pathPlanningApi.synchronousLineObject(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST); + commonApi.commonMethod(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST); } /** * 设置车辆空闲 + * * @param robotNo */ @Override diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/RobotTaskAutoMoveServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/RobotTaskAutoMoveServiceImpl.java index 75375bb46..7f6a94d96 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/RobotTaskAutoMoveServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/RobotTaskAutoMoveServiceImpl.java @@ -54,26 +54,12 @@ public class RobotTaskAutoMoveServiceImpl implements RobotTaskAutoMoveService { @Resource private RobotTaskAutoMoveMapper taskAutoMoveMapper; - @Autowired - private RobotInformationMapper robotInformationMapper; - - @Autowired - private RobotTaskMapper robotTaskMapper; - @Autowired private RobotTaskDetailMapper robotTaskDetailMapper; - @Resource - private RobotTaskApi robotTaskApi; - - @Resource - private PositionMapItemMapper positionMapItemMapper; - @Resource private WareHouseLocationMapper locationMapper; - @Autowired - private DistributeTasksService distributeTasksService; @Value("${zn.lane_auto_move:true}") private Boolean laneAutoMove; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java index fe1e4aba5..36a49f9f8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java @@ -4,7 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; -import cn.iocoder.yudao.module.mqtt.api.path.PathPlanningApi; +import cn.iocoder.yudao.module.mqtt.api.common.CommonApi; import cn.iocoder.yudao.module.mqtt.api.path.task.TaskLimitationAreaDTO; import cn.iocoder.yudao.module.mqtt.api.path.task.TaskRobotNoLimittationAreaDTO; import cn.iocoder.yudao.module.mqtt.api.path.task.TaskToPathPlanningDTO; @@ -81,9 +81,6 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { @Resource private PositionMapMapper positionMapMapper; - @Resource - private PathPlanningApi pathPlanningApi; - @Value("${zn.robot_chearg.release_location_number_config:50}") private Long releaseLocationNumberConfig; @@ -102,6 +99,9 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { @Autowired private RobotTaskMapper robotTaskMapper; + @Resource + private CommonApi commonApi; + /** * 下发任务给PP */ @@ -309,7 +309,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { } log.info("派车去停车点--任务下发给PP :{}", JSON.toJSONString(pathPlanningList)); - pathPlanningApi.synchronousLineObject(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST); + commonApi.commonMethod(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST); } @Override @@ -369,7 +369,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { } log.info("充电任务下发给PP :{}", JSON.toJSONString(pathPlanningList)); - pathPlanningApi.synchronousLineObject(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST); + commonApi.commonMethod(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST); } @Transactional(rollbackFor = Exception.class) @@ -503,7 +503,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { if (ObjectUtil.isNotEmpty(pathPlanningList)) { log.info("作业任务下发给PP :{}", JSON.toJSONString(pathPlanningList)); - pathPlanningApi.synchronousLineObject(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST); + commonApi.commonMethod(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST); } }