diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/controller/admin/robot/RemoteRobotController.java b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/controller/admin/robot/RemoteRobotController.java index ca5b61603..d09555a85 100644 --- a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/controller/admin/robot/RemoteRobotController.java +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/controller/admin/robot/RemoteRobotController.java @@ -4,15 +4,16 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.PositionMapRespDTO; import cn.iocoder.yudao.module.remote.service.robot.RemoteRobotService; import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotDTO; +import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotStatusDTO; 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.beans.factory.annotation.Autowired; +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.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -33,5 +34,38 @@ public class RemoteRobotController { return success(list); } + @GetMapping("/emergencyStopOrRecovery") + @Operation(summary = "一键急停or一键恢复地图上所有AGV") + @Parameter(name = "type", description = "类型(1:停止, 0:恢复)", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:position-map:emergencyStopOrRecovery')") + public CommonResult remoteEmergencyStopOrRecovery(@RequestParam("id") Long id, @RequestParam("type") Integer type) { + remoteRobotService.remoteEmergencyStopOrRecovery(id,type); + return success(true); + } + + @PostMapping("/getRobotRemoteStatus") + @Operation(summary = "获取机器人远遥模式/急停/协控状态") + public CommonResult getRobotRemoteStatus(HttpServletRequest request) { + return success(remoteRobotService.getRemoteRobotStatus(request)); + } + + + @GetMapping("/stop") + @Operation(summary = "暂停车辆") + public CommonResult robotStop(@RequestParam("robotNo") String robotNo) { + remoteRobotService.robotStop(robotNo); + return success(true); + } + + + @GetMapping("/recovery") + @Operation(summary = "恢复车辆") + public CommonResult recovery(@RequestParam("robotNo") String robotNo) { + remoteRobotService.recovery(robotNo); + return success(true); + } + + + } diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/service/robot/RemoteRobotService.java b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/service/robot/RemoteRobotService.java index ba86c1205..300238eeb 100644 --- a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/service/robot/RemoteRobotService.java +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/service/robot/RemoteRobotService.java @@ -2,9 +2,43 @@ package cn.iocoder.yudao.module.remote.service.robot; import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.PositionMapRespDTO; import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotDTO; +import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotStatusDTO; +import javax.servlet.http.HttpServletRequest; import java.util.List; public interface RemoteRobotService { + /** + * 获取地图区域对应的机器人信息 + * @param positionMapRespDTO + * @return + */ List remoteGetAreaRobot(PositionMapRespDTO positionMapRespDTO); + + /** + * 键急停or一键恢复地图上所有AGV + * @param id + * @param type + */ + void remoteEmergencyStopOrRecovery(Long id, Integer type); + + /** + * 获取机器人远遥模式/急停/协控状态 + * @param request + * @return + */ + RemoteRobotStatusDTO getRemoteRobotStatus(HttpServletRequest request); + + /** + * 暂停车辆 + * @param robotNo + * @return + */ + void robotStop(String robotNo); + + /** + * 恢复车辆 + * @param robotNo + */ + void recovery(String robotNo); } 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 0d5ad0781..a5b932324 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 @@ -1,14 +1,22 @@ package cn.iocoder.yudao.module.remote.service.robot; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.PositionMapRespDTO; +import cn.iocoder.yudao.module.remote.util.IpUtils; import cn.iocoder.yudao.module.system.api.remote.RemoteRobotApi; import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotDTO; +import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotStatusDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.util.List; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.PATH_PLANNING_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.TASK_COMMONG_FAIL; + @Slf4j @Service public class RemoteRobotServiceImpl implements RemoteRobotService{ @@ -16,8 +24,62 @@ public class RemoteRobotServiceImpl implements RemoteRobotService{ @Resource private RemoteRobotApi remoteRobotApi; + /** + * 获取地图区域对应的机器人信息 + * @param positionMapRespDTO + * @return + */ @Override public List remoteGetAreaRobot(PositionMapRespDTO positionMapRespDTO) { return remoteRobotApi.remoteGetAreaRobot(positionMapRespDTO.getId()); } + + /** + * 一键急停or一键恢复地图上所有AGV + * @param id + * @param type + */ + @Override + public void remoteEmergencyStopOrRecovery(Long id, Integer type) { + CommonResult result = remoteRobotApi.remoteEmergencyStopOrRecovery(id,type); + if (!result.isSuccess()){ + throw exception0(TASK_COMMONG_FAIL.getCode(), result.getMsg()); + } + } + + /** + * 获取机器人远遥模式/急停/协控状态 + * @param request + * @return + */ + @Override + public RemoteRobotStatusDTO getRemoteRobotStatus(HttpServletRequest request) { + String ip = IpUtils.getIp(request); + return remoteRobotApi.getRemoteRobotStatus(ip); + } + + /** + * 暂停机器人 + * @param robotNo + * @return + */ + @Override + public void robotStop(String robotNo) { + CommonResult result = remoteRobotApi.robotStop(robotNo); + if (!result.isSuccess()){ + throw exception0(TASK_COMMONG_FAIL.getCode(), result.getMsg()); + } + } + + /** + * 恢复车辆 + * @param robotNo + */ + @Override + public void recovery(String robotNo) { + CommonResult result = remoteRobotApi.recovery(robotNo); + if (!result.isSuccess()){ + throw exception0(TASK_COMMONG_FAIL.getCode(), result.getMsg()); + } + } } diff --git a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/util/IpUtils.java b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/util/IpUtils.java index dc87a5713..5fc4e90f8 100644 --- a/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/util/IpUtils.java +++ b/yudao-module-remote/yudao-module-remote-biz/src/main/java/cn/iocoder/yudao/module/remote/util/IpUtils.java @@ -30,7 +30,7 @@ public class IpUtils ip = request.getRemoteAddr(); } if (ip.equals("0:0:0:0:0:0:0:1")) { - ip = "localhost"; + ip = "127.0.0.1"; } return ip; } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/remote/RemoteRobotApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/remote/RemoteRobotApi.java index 3117a33f3..d25b354c3 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/remote/RemoteRobotApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/remote/RemoteRobotApi.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.system.api.remote; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotDTO; +import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotStatusDTO; import cn.iocoder.yudao.module.system.enums.ApiConstants; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -19,4 +21,20 @@ public interface RemoteRobotApi { @PostMapping(PREFIX + "/remoteGetAreaRobot") @Operation(summary = "获取地图区域对应的机器人信息") List remoteGetAreaRobot(@RequestParam(value = "mapId",defaultValue = "-1") Long mapId); + + @PostMapping(PREFIX + "/remoteEmergencyStopOrRecovery") + @Operation(summary = "一键急停or一键恢复地图上所有AGV") + CommonResult remoteEmergencyStopOrRecovery(@RequestParam(value = "mapId") Long mapId, @RequestParam(value = "type") Integer type); + + @PostMapping(PREFIX + "/getRemoteRobotStatus") + @Operation(summary = "获取机器人远遥模式/急停/协控状态") + RemoteRobotStatusDTO getRemoteRobotStatus(@RequestParam(value = "ip") String ip); + + @PostMapping(PREFIX + "/robotStop") + @Operation(summary = "暂停机器人") + CommonResult robotStop(@RequestParam(value = "robotNo") String robotNo); + + @PostMapping(PREFIX + "/recovery") + @Operation(summary = "恢复机器人") + CommonResult recovery(@RequestParam(value = "robotNo") String robotNo); } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/remote/dto/RemoteRobotStatusDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/remote/dto/RemoteRobotStatusDTO.java new file mode 100644 index 000000000..e82254d7c --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/remote/dto/RemoteRobotStatusDTO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.system.api.remote.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class RemoteRobotStatusDTO { + + @Schema(description = "AGV编号") + private String robotNo; + + @Schema(description = "车辆是否暂停(0:已经暂停, 1:没暂停)") + private Integer isStop = 1; + + @Schema(description = "远遥模式(0:自动模式, 1:手动模式, 2:自由模式)") + private Integer remoteMode = 0; + + @Schema(description = "协控(0:关闭协控, 1:开启协控)") + private Integer collaborativeControl = 0; + + @Schema(description = "是否可以点击: 任务完成(0:可以点, 1:不能点任务完成)") + private Integer clickTaskDone = 1; +} 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 d6c70d066..06f82c6dd 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 @@ -195,6 +195,7 @@ public interface ErrorCodeConstants { ErrorCode ROBOT_NOT_FOUND_FREE_CHARGING_STATION = new ErrorCode(1-002-034-007, "没有空闲的充电桩"); ErrorCode ROBOT_HAVE_DOING_TASK = new ErrorCode(1-002-034-010, "车辆有处理中的任务,不允许修改/删除车辆编号和Mac地址"); ErrorCode ROBOT_REJECTION = new ErrorCode(1-002-034-011, "车辆已锁定"); + ErrorCode ROBOT_DOING_REMOTE = new ErrorCode(1-002-034-012, "车辆目前远遥控制中,不能修改车辆信息"); // ========== 机器人任务主表 1-002-035-000 ========== ErrorCode TASK_NOT_EXISTS = new ErrorCode(1-002-035-001, "车辆任务主表不存在"); @@ -216,6 +217,7 @@ public interface ErrorCodeConstants { ErrorCode TASK_RELEASE_LOCATION_HAVE_OTHER_TASK = new ErrorCode(1-002-035-109, "放货库位已经分配了其他任务"); ErrorCode TASK_CREATE_FAIL = new ErrorCode(1-002-035-110, "任务创建失败:"); ErrorCode ROBOT_DO_TASK_FAIL = new ErrorCode(1-002-035-112, "车机反馈不能接任务"); + ErrorCode TASK_COMMONG_FAIL = new ErrorCode(1-002-035-113, "下发失败"); // ========== 机器人任务明细 1-002-036-000 ========== ErrorCode TASK_DETAIL_NOT_EXISTS = new ErrorCode(1-002-036-001, "车辆任务明细不存在"); @@ -271,6 +273,8 @@ public interface ErrorCodeConstants { ErrorCode TASK_PROCEED_NOT_EXISTS = new ErrorCode(1_002_051_001, "车辆衔接任务不存在"); // ========== 车辆(地图)急停记录 1_002_052_001 ========== ErrorCode MAP_STOP_NOT_EXISTS = new ErrorCode(1_002_052_001, "车辆(地图)急停记录不存在"); + ErrorCode ROBOT_ALREADY_STOP = new ErrorCode(1_002_052_002, "车辆已经暂停"); + ErrorCode ROBOT_ALREADY_RECOVERY = new ErrorCode(1_002_052_003, "车辆已经恢复"); // ========== 远遥设备信息 1_002_053_001 ========== ErrorCode CONTROLLER_INFORMATION_NOT_EXISTS = new ErrorCode(1_002_053_001, "远遥设备信息不存在"); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/remote/RemoteRobotApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/remote/RemoteRobotApiImpl.java index 4ce122549..410fea160 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/remote/RemoteRobotApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/remote/RemoteRobotApiImpl.java @@ -1,7 +1,11 @@ package cn.iocoder.yudao.module.system.api.remote; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotDTO; +import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotStatusDTO; import cn.iocoder.yudao.module.system.service.positionmap.PositionMapService; +import cn.iocoder.yudao.module.system.service.remote.RemoteControllerInformationService; +import cn.iocoder.yudao.module.system.service.robot.mapstop.RobotMapStopService; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; @@ -14,9 +18,15 @@ import java.util.List; @Validated public class RemoteRobotApiImpl implements RemoteRobotApi{ + @Resource + private RobotMapStopService mapStopService; + @Resource private PositionMapService positionMapService; + @Resource + private RemoteControllerInformationService controllerInformationService; + /** * 远遥获取地图和车辆信息 * @param mapId @@ -27,5 +37,48 @@ public class RemoteRobotApiImpl implements RemoteRobotApi{ return positionMapService.getRemoteAreaRobotByMapId(mapId); } + /** + * 远遥车辆暂停 + * @param mapId + * @param type + */ + @Override + public CommonResult remoteEmergencyStopOrRecovery(Long mapId, Integer type) { + positionMapService.emergencyStopOrRecovery(mapId,type,true); + return CommonResult.success(true); + } + + /** + * 获取机器人远遥模式/急停/协控状态 + * @param ip + * @return + */ + @Override + public RemoteRobotStatusDTO getRemoteRobotStatus(String remoteIp) { + return controllerInformationService.getRemoteRobotStatus(remoteIp); + } + + /** + * 远遥暂停车辆 + * @param robotNo + * @return + */ + @Override + public CommonResult robotStop(String robotNo) { + mapStopService.remoteStopRobot(robotNo); + return CommonResult.success(true); + } + + /** + * 远遥恢复车辆 + * @param robotNo + * @return + */ + @Override + public CommonResult recovery(String robotNo) { + mapStopService.remoteRecoveryRobot(robotNo); + return CommonResult.success(true); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/PositionMapController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/PositionMapController.java index f0e4fb20e..44ed7188d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/PositionMapController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/PositionMapController.java @@ -58,7 +58,7 @@ public class PositionMapController { @Parameter(name = "type", description = "类型(1:停止, 0:恢复)", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('system:position-map:emergencyStopOrRecovery')") public CommonResult emergencyStopOrRecovery(@RequestParam("id") Long id, @RequestParam("type") Integer type) { - positionMapService.emergencyStopOrRecovery(id,type); + positionMapService.emergencyStopOrRecovery(id,type,false); return success(true); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/log/UserOperationLogDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/log/UserOperationLogDO.java index 0d9d0a394..d6d799533 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/log/UserOperationLogDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/log/UserOperationLogDO.java @@ -25,7 +25,7 @@ public class UserOperationLogDO extends BaseDO { /** * 主键ID */ - @TableId + @TableId(type = IdType.ASSIGN_ID) private Long id; /** * 操作人员 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotMapStopMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotMapStopMapper.java index eedae2b12..5f862fa00 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotMapStopMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotMapStopMapper.java @@ -32,4 +32,10 @@ public interface RobotMapStopMapper extends BaseMapperX { * @param mapId */ void deleteRobotMapStopByMapId(@Param("mapId") Long mapId); + + /** + * 根据车辆编号删除 + * @param robotNos + */ + void deleteRobotMapStopByRobotNos(@Param("robotNos") List robotNos); } \ No newline at end of file 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 ca0e6fe24..6ab979ec8 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 @@ -97,7 +97,7 @@ public interface PositionMapService extends IService { * * @param id */ - void emergencyStopOrRecovery(Long id,Integer type); + void emergencyStopOrRecovery(Long id,Integer type,Boolean isRemote); /** * 获取所有地图 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 496a2c73b..e5e5b9540 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 @@ -344,7 +344,7 @@ public class PositionMapServiceImpl extends ServiceImpl robotNos, String str) { - for (String robotNo : robotNos) { - String mac = informationService.getMacByRobotNo(robotNo); - commonApi.commonMethod(robotSimulationPose, RobotTopicConstant.ROBOT_COMMAND_TOPIC + mac); - UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder() - .operateAction(str + robotNo) - .nickName(SecurityFrameworkUtils.getLoginUserNickname()).build(); - userOperationLogService.createUserOperationLog(operationLog); - } - } + @Override public List getAllMap() { 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 77139e161..93f85657f 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 @@ -4,6 +4,7 @@ import java.util.*; import javax.validation.*; 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.controller.admin.remote.vo.RemoteControllerInformationPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.remote.vo.RemoteControllerInformationSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.remote.RemoteControllerInformationDO; @@ -74,4 +75,17 @@ public interface RemoteControllerInformationService extends IService getAllRemoteController(); + /** + * 获取机器人远遥模式/急停/协控状态 + * @param ip + * @return + */ + RemoteRobotStatusDTO getRemoteRobotStatus(String ip); + + /** + * 根据机器人编号查询 + * @param robotNo + * @return + */ + RemoteControllerInformationDO getRemoteControllerByRobotNo(String robotNo); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/remote/RemoteControllerInformationServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/remote/RemoteControllerInformationServiceImpl.java index 9d6a20fb4..962a0fdd8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/remote/RemoteControllerInformationServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/remote/RemoteControllerInformationServiceImpl.java @@ -4,13 +4,21 @@ import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; 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.controller.admin.log.vo.UserOperationLogSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.remote.vo.RemoteControllerInformationPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.remote.vo.RemoteControllerInformationSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO; import cn.iocoder.yudao.module.system.dal.dataobject.remote.RemoteControllerInformationDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; +import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotMapStopDO; import cn.iocoder.yudao.module.system.dal.mysql.remote.RemoteControllerInformationMapper; +import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum; +import cn.iocoder.yudao.module.system.enums.path.PathTaskTypeEnum; +import cn.iocoder.yudao.module.system.enums.robot.actionlog.ActionStatusEnum; +import cn.iocoder.yudao.module.system.service.log.RobotTaskDetailActionLogService; import cn.iocoder.yudao.module.system.service.log.UserOperationLogService; +import cn.iocoder.yudao.module.system.service.robot.mapstop.RobotMapStopService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.stereotype.Service; @@ -45,6 +53,12 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl() + .eq(RemoteControllerInformationDO::getRemoteIp, remoteIp) + .last("limit 1")); + if (ObjectUtil.isEmpty(information) || ObjectUtil.isEmpty(information.getRobotNo())) { + return null; + } + RemoteRobotStatusDTO remoteRobotStatus = BeanUtils.toBean(information, RemoteRobotStatusDTO.class); + List robotMapStops = mapStopService.getStopRobotNoByRobotNo(information.getRobotNo()); + if (ObjectUtil.isNotEmpty(robotMapStops)) { + remoteRobotStatus.setIsStop(ZeroOneEnum.ZERO.getType()); + } + RobotTaskDetailActionLogDO actionLog = taskDetailActionLogService.getLastTaskByRobotNo(information.getRobotNo()); + if (ObjectUtil.isNotEmpty(actionLog) && !actionLog.getActionStatus().equals(ActionStatusEnum.DONE.getType()) + && (PathTaskTypeEnum.TAKE_RELEASE.getType().equals(actionLog.getCommandType()) + || PathTaskTypeEnum.TAKE.getType().equals(actionLog.getCommandType()) + || PathTaskTypeEnum.RELEASE.getType().equals(actionLog.getCommandType())) ) { + remoteRobotStatus.setClickTaskDone(ZeroOneEnum.ZERO.getType()); + } + + return remoteRobotStatus; + } + + /** + * 根据车辆编号查询 + * @param robotNo + * @return + */ + @Override + public RemoteControllerInformationDO getRemoteControllerByRobotNo(String robotNo) { + RemoteControllerInformationDO information = controllerInformationMapper.selectOne(new LambdaQueryWrapper() + .eq(RemoteControllerInformationDO::getRobotNo, robotNo) + .last("limit 1")); + return information; + } + } 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 2adc06c92..aa36b1689 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,6 +1,7 @@ package cn.iocoder.yudao.module.system.service.robot; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotSimulationPoseDTO; import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO; import cn.iocoder.yudao.module.system.api.robot.vo.RobotInformationVO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; @@ -166,4 +167,12 @@ public interface RobotInformationService extends IService { * @return */ List getRobotByFloorAndArea(String floor, String area); + + /** + * 车辆一键暂停或启动 + * @param robotSimulationPose + * @param robotNos + * @param str + */ + void sendEmergencyStopOrRecoveryToRobot(RobotSimulationPoseDTO robotSimulationPose, List robotNos, String str); } 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 003776b37..560197d3f 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 @@ -18,6 +18,7 @@ import cn.iocoder.yudao.module.mqtt.api.path.task.TaskRobotNoLimittationAreaDTO; import cn.iocoder.yudao.module.mqtt.api.path.task.TaskToPathPlanningDTO; import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskDTO; import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotRcsHeartBeatDTO; +import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotSimulationPoseDTO; import cn.iocoder.yudao.module.mqtt.enums.task.ExecutionTypeEnum; import cn.iocoder.yudao.module.system.api.robot.RequestProcessor; import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO; @@ -41,6 +42,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.informationmapassociation.I import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO; import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO; import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO; +import cn.iocoder.yudao.module.system.dal.dataobject.remote.RemoteControllerInformationDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotModelDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO; @@ -50,6 +52,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationM import cn.iocoder.yudao.module.system.dal.mysql.information.DeviceInformationMapper; import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapItemMapper; import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapMapper; +import cn.iocoder.yudao.module.system.dal.mysql.remote.RemoteControllerInformationMapper; 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; @@ -71,6 +74,7 @@ import cn.iocoder.yudao.module.system.service.informationmapassociation.Informat import cn.iocoder.yudao.module.system.service.log.RobotTaskDetailActionLogService; import cn.iocoder.yudao.module.system.service.log.UserOperationLogService; import cn.iocoder.yudao.module.system.service.positionmap.PositionMapItemService; +import cn.iocoder.yudao.module.system.service.remote.RemoteControllerInformationService; import cn.iocoder.yudao.module.system.service.robot.camera.RobotCameraService; import cn.iocoder.yudao.module.system.service.robot.pathplanning.RobotPathPlanningService; import cn.iocoder.yudao.module.system.service.robot.proceed.RobotTaskProceedService; @@ -174,6 +178,10 @@ public class RobotInformationServiceImpl extends ServiceImpl() + .eq(RemoteControllerInformationDO::getRobotNo, robotInformationDO.getRobotNo()) + .last("limit 1")); + if (ObjectUtil.isNotEmpty(remoteControllerInformation)) { + throw exception(ROBOT_DOING_REMOTE); + } + cameraService.deleteCameraByRobotNo(robotInformationDO.getRobotNo()); if (!updateReqVO.getRobotNo().equals(robotInformationDO.getRobotNo()) @@ -1229,5 +1244,23 @@ public class RobotInformationServiceImpl extends ServiceImpl robotNos, String str) { + for (String robotNo : robotNos) { + String mac = getMacByRobotNo(robotNo); + commonApi.commonMethod(robotSimulationPose, RobotTopicConstant.ROBOT_COMMAND_TOPIC + mac); + UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder() + .operateAction(str + robotNo) + .nickName(SecurityFrameworkUtils.getLoginUserNickname()).build(); + userOperationLogService.createUserOperationLog(operationLog); + } + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/mapstop/RobotMapStopService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/mapstop/RobotMapStopService.java index 365a52109..4e56427fd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/mapstop/RobotMapStopService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/mapstop/RobotMapStopService.java @@ -94,4 +94,30 @@ public interface RobotMapStopService extends IService { * @return */ List getAllRobotMapStops(Integer type); + + /** + * 根据车辆编号查询暂停信息 + * @param robotNo + * @return + */ + List getStopRobotNoByRobotNo(String robotNo); + + /** + * 远遥暂停车辆 + * @param robotNo + * @return + */ + void remoteStopRobot(String robotNo); + + /** + * 根据车辆编号删除 + * @param robotNos + */ + void deleteRobotMapStopByRobotNos(List robotNos); + + /** + * 远遥恢复车辆 + * @param robotNo + */ + void remoteRecoveryRobot(String robotNo); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/mapstop/RobotMapStopServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/mapstop/RobotMapStopServiceImpl.java index b58ac7cf0..90be69260 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/mapstop/RobotMapStopServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/mapstop/RobotMapStopServiceImpl.java @@ -2,15 +2,27 @@ package cn.iocoder.yudao.module.system.service.robot.mapstop; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotSimulationPoseDTO; +import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO; +import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant; +import cn.iocoder.yudao.module.system.controller.admin.log.vo.UserOperationLogSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.robot.mapstop.RobotMapStopPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.robot.mapstop.RobotMapStopSaveReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO; +import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotMapStopDO; +import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotMapStopMapper; import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum; -import cn.iocoder.yudao.module.system.enums.item.PositionMapItemEnum; +import cn.iocoder.yudao.module.system.enums.robot.task.RobotCommandTypeEnum; +import cn.iocoder.yudao.module.system.service.log.UserOperationLogService; +import cn.iocoder.yudao.module.system.service.robot.RobotInformationService; +import cn.iocoder.yudao.module.system.util.redis.RedisUtil; +import com.alibaba.fastjson.JSON; import org.springframework.stereotype.Service; + import javax.annotation.Resource; + import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; @@ -18,13 +30,12 @@ import java.util.*; import java.util.stream.Collectors; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MAP_STOP_NOT_EXISTS; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** * 车辆(地图)急停记录 Service 实现类 @@ -38,6 +49,18 @@ public class RobotMapStopServiceImpl extends ServiceImpl getStopRobotNoByMapIds(Long id) { List positionMapItems = mapStopMapper.selectList(new LambdaQueryWrapperX() - .eq(RobotMapStopDO::getStopType, ZeroOneEnum.ONE.getType()) + .eq(RobotMapStopDO::getStopType, ZeroOneEnum.ZERO.getType()) .eq(RobotMapStopDO::getPositionMapId, id)); if (ObjectUtil.isEmpty(positionMapItems)) { return new ArrayList<>(); @@ -108,7 +131,6 @@ public class RobotMapStopServiceImpl extends ServiceImpl getStopRobotNoByRobotNo(String robotNo) { + return mapStopMapper.selectList(new LambdaQueryWrapperX() + .eq(RobotMapStopDO::getStopType, ZeroOneEnum.ONE.getType()) + .eq(RobotMapStopDO::getRobotNo, robotNo)); + } + + /** + * 远遥暂停车辆 + * + * @param robotNo + * @return + */ + @Override + public void remoteStopRobot(String robotNo) { + List stopRobotNoByRobotNo = getStopRobotNoByRobotNo(robotNo); + if (ObjectUtil.isNotEmpty(stopRobotNoByRobotNo)) { + throw exception(ROBOT_ALREADY_STOP); + } + + RobotSimulationPoseDTO robotSimulationPose = new RobotSimulationPoseDTO(); + robotSimulationPose.setCommandType(RobotCommandTypeEnum.EMERGENCY_STOP.getType()); + List list = Arrays.asList(robotNo); + informationService.sendEmergencyStopOrRecoveryToRobot(robotSimulationPose, list, "远遥暂停车辆"); + + String mac = informationService.getMacByRobotNo(robotNo); + String floorAreaKey = RobotTaskChcheConstant.ROBOT_FLOOR_AREA + mac; + Object o = redisUtil.get(floorAreaKey); + + Long id = -1l; + if (ObjectUtil.isNotEmpty(o)) { + FloorZoneDTO floorZone = JSON.parseObject((String) o, FloorZoneDTO.class); + PositionMapDO positionMap = positionMapMapper.selectOne(new LambdaQueryWrapperX() + .eq(PositionMapDO::getFloor, floorZone.getFloor()) + .eq(PositionMapDO::getArea, floorZone.getArea())); + if (ObjectUtil.isNotEmpty(positionMap)) { + id = positionMap.getId(); + } + } + + createRobotMapStop(id, list); + + } + + /** + * 根据车辆编号删除 + * + * @param robotNos + */ + @Override + public void deleteRobotMapStopByRobotNos(List robotNos) { + mapStopMapper.deleteRobotMapStopByRobotNos(robotNos); + } + + /** + * 远遥恢复车辆 + * + * @param robotNo + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void remoteRecoveryRobot(String robotNo) { + List stopRobotNoByRobotNo = getStopRobotNoByRobotNo(robotNo); + if (ObjectUtil.isEmpty(stopRobotNoByRobotNo)) { + throw exception(ROBOT_ALREADY_RECOVERY); + } + + RobotSimulationPoseDTO robotSimulationPose = new RobotSimulationPoseDTO(); + robotSimulationPose.setCommandType(RobotCommandTypeEnum.RECOVERY.getType()); + List list = Arrays.asList(robotNo); + informationService.sendEmergencyStopOrRecoveryToRobot(robotSimulationPose, list, "远遥恢复车辆"); + + deleteRobotMapStopByRobotNos(list); + + List mapStopDOList = mapStopMapper.selectList(new LambdaQueryWrapperX() + .eq(RobotMapStopDO::getPositionMapId, stopRobotNoByRobotNo.get(0).getPositionMapId())); + //说明此时地图上没有其他被暂停的车辆了 + if (ObjectUtil.isNotEmpty(mapStopDOList) && mapStopDOList.size() == 1) { + PositionMapDO positionMapDO = positionMapMapper.selectById(mapStopDOList.get(0).getPositionMapId()); + deleteRobotMapStopByMapId(mapStopDOList.get(0).getPositionMapId()); + UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder() + .operateAction(positionMapDO.getFloor() + "层" + positionMapDO.getArea() + " 地图上所有车辆已经恢复,所以把地图也设置为恢复") + .nickName(SecurityFrameworkUtils.getLoginUserNickname()).build(); + userOperationLogService.createUserOperationLog(operationLog); + + } + } + + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotMapStopMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotMapStopMapper.xml index 803cf4289..e2f0b7028 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotMapStopMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotMapStopMapper.xml @@ -16,4 +16,16 @@ where position_map_id = #{mapId} + + + delete + from + robot_map_stop + where + robot_no in + + #{robotNo} + + \ No newline at end of file