远遥暂停车辆/恢复

This commit is contained in:
cbs 2025-04-22 14:01:30 +08:00
parent ae3f3f7317
commit b0a5dc3b35
20 changed files with 528 additions and 28 deletions

View File

@ -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<Boolean> remoteEmergencyStopOrRecovery(@RequestParam("id") Long id, @RequestParam("type") Integer type) {
remoteRobotService.remoteEmergencyStopOrRecovery(id,type);
return success(true);
}
@PostMapping("/getRobotRemoteStatus")
@Operation(summary = "获取机器人远遥模式/急停/协控状态")
public CommonResult<RemoteRobotStatusDTO> getRobotRemoteStatus(HttpServletRequest request) {
return success(remoteRobotService.getRemoteRobotStatus(request));
}
@GetMapping("/stop")
@Operation(summary = "暂停车辆")
public CommonResult<Boolean> robotStop(@RequestParam("robotNo") String robotNo) {
remoteRobotService.robotStop(robotNo);
return success(true);
}
@GetMapping("/recovery")
@Operation(summary = "恢复车辆")
public CommonResult<Boolean> recovery(@RequestParam("robotNo") String robotNo) {
remoteRobotService.recovery(robotNo);
return success(true);
}
}

View File

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

View File

@ -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<RemoteRobotDTO> remoteGetAreaRobot(PositionMapRespDTO positionMapRespDTO) {
return remoteRobotApi.remoteGetAreaRobot(positionMapRespDTO.getId());
}
/**
* 一键急停or一键恢复地图上所有AGV
* @param id
* @param type
*/
@Override
public void remoteEmergencyStopOrRecovery(Long id, Integer type) {
CommonResult<Boolean> 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<Boolean> result = remoteRobotApi.robotStop(robotNo);
if (!result.isSuccess()){
throw exception0(TASK_COMMONG_FAIL.getCode(), result.getMsg());
}
}
/**
* 恢复车辆
* @param robotNo
*/
@Override
public void recovery(String robotNo) {
CommonResult<Boolean> result = remoteRobotApi.recovery(robotNo);
if (!result.isSuccess()){
throw exception0(TASK_COMMONG_FAIL.getCode(), result.getMsg());
}
}
}

View File

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

View File

@ -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<RemoteRobotDTO> remoteGetAreaRobot(@RequestParam(value = "mapId",defaultValue = "-1") Long mapId);
@PostMapping(PREFIX + "/remoteEmergencyStopOrRecovery")
@Operation(summary = "一键急停or一键恢复地图上所有AGV")
CommonResult<Boolean> 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<Boolean> robotStop(@RequestParam(value = "robotNo") String robotNo);
@PostMapping(PREFIX + "/recovery")
@Operation(summary = "恢复机器人")
CommonResult<Boolean> recovery(@RequestParam(value = "robotNo") String robotNo);
}

View File

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

View File

@ -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, "远遥设备信息不存在");

View File

@ -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<Boolean> 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<Boolean> robotStop(String robotNo) {
mapStopService.remoteStopRobot(robotNo);
return CommonResult.success(true);
}
/**
* 远遥恢复车辆
* @param robotNo
* @return
*/
@Override
public CommonResult<Boolean> recovery(String robotNo) {
mapStopService.remoteRecoveryRobot(robotNo);
return CommonResult.success(true);
}
}

View File

@ -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<Boolean> emergencyStopOrRecovery(@RequestParam("id") Long id, @RequestParam("type") Integer type) {
positionMapService.emergencyStopOrRecovery(id,type);
positionMapService.emergencyStopOrRecovery(id,type,false);
return success(true);
}

View File

@ -25,7 +25,7 @@ public class UserOperationLogDO extends BaseDO {
/**
* 主键ID
*/
@TableId
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**
* 操作人员

View File

@ -32,4 +32,10 @@ public interface RobotMapStopMapper extends BaseMapperX<RobotMapStopDO> {
* @param mapId
*/
void deleteRobotMapStopByMapId(@Param("mapId") Long mapId);
/**
* 根据车辆编号删除
* @param robotNos
*/
void deleteRobotMapStopByRobotNos(@Param("robotNos") List<String> robotNos);
}

View File

@ -97,7 +97,7 @@ public interface PositionMapService extends IService<PositionMapDO> {
*
* @param id
*/
void emergencyStopOrRecovery(Long id,Integer type);
void emergencyStopOrRecovery(Long id,Integer type,Boolean isRemote);
/**
* 获取所有地图

View File

@ -344,7 +344,7 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
@Override
@Transactional(rollbackFor = Exception.class)
public void emergencyStopOrRecovery(Long id, Integer type) {
public void emergencyStopOrRecovery(Long id, Integer type,Boolean isRemote) {
// 先获取当前地图上的所有AGV信息
PositionMapDO positionMapDO = positionMapMapper.selectById(id);
@ -358,14 +358,26 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
robotNos = informationService.getRobotByFloorAndArea(String.valueOf(positionMapDO.getFloor()), positionMapDO.getArea());
robotSimulationPose.setCommandType(RobotCommandTypeEnum.EMERGENCY_STOP.getType());
str = RobotCommandTypeEnum.EMERGENCY_STOP.getMsg();
mapStr = "一键暂停 " + mapStr;
if (isRemote) {
mapStr = "远遥一键暂停 " + mapStr;
}else {
mapStr = "一键暂停 " + mapStr;
}
} else {
//恢复
robotNos = robotMapStopService.getStopRobotNoByMapIds(id);
robotSimulationPose.setCommandType(RobotCommandTypeEnum.RECOVERY.getType());
str = RobotCommandTypeEnum.RECOVERY.getMsg();
mapStr = "一键恢复 " + mapStr;
if (isRemote) {
mapStr = "远遥一键恢复 " + mapStr;
}else {
mapStr = "一键恢复 " + mapStr;
}
robotMapStopService.deleteRobotMapStopByMapId(id);
if (ObjectUtil.isNotEmpty(robotNos)) {
robotMapStopService.deleteRobotMapStopByRobotNos(robotNos);
}
}
if (ObjectUtil.isEmpty(robotNos)) {
@ -380,23 +392,14 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
robotMapStopService.createMapStop(robotMapStopSave);
}
sendEmergencyStopOrRecoveryToRobot(robotSimulationPose, robotNos, str);
informationService.sendEmergencyStopOrRecoveryToRobot(robotSimulationPose, robotNos, str);
UserOperationLogSaveReqVO operationLog = UserOperationLogSaveReqVO.builder()
.operateAction(mapStr)
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
userOperationLogService.createUserOperationLog(operationLog);
}
public void sendEmergencyStopOrRecoveryToRobot(RobotSimulationPoseDTO robotSimulationPose, List<String> 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<PositionMapDO> getAllMap() {

View File

@ -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<RemoteContr
*/
List<RemoteControllerInformationDO> getAllRemoteController();
/**
* 获取机器人远遥模式/急停/协控状态
* @param ip
* @return
*/
RemoteRobotStatusDTO getRemoteRobotStatus(String ip);
/**
* 根据机器人编号查询
* @param robotNo
* @return
*/
RemoteControllerInformationDO getRemoteControllerByRobotNo(String robotNo);
}

View File

@ -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<RemoteCo
@Resource
private UserOperationLogService userOperationLogService;
@Resource
private RobotMapStopService mapStopService;
@Resource
private RobotTaskDetailActionLogService taskDetailActionLogService;
@Override
public Long createControllerInformation(RemoteControllerInformationSaveReqVO createReqVO) {
// 插入
@ -147,5 +161,47 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
.ne(RemoteControllerInformationDO::getRobotNo, ""));
}
/**
* 获取机器人远遥模式/急停/协控状态
* @param remoteIp
* @return
*/
@Override
public RemoteRobotStatusDTO getRemoteRobotStatus(String remoteIp) {
RemoteControllerInformationDO information = controllerInformationMapper.selectOne(new LambdaQueryWrapper<RemoteControllerInformationDO>()
.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<RobotMapStopDO> 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<RemoteControllerInformationDO>()
.eq(RemoteControllerInformationDO::getRobotNo, robotNo)
.last("limit 1"));
return information;
}
}

View File

@ -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<RobotInformationDO> {
* @return
*/
List<String> getRobotByFloorAndArea(String floor, String area);
/**
* 车辆一键暂停或启动
* @param robotSimulationPose
* @param robotNos
* @param str
*/
void sendEmergencyStopOrRecoveryToRobot(RobotSimulationPoseDTO robotSimulationPose, List<String> robotNos, String str);
}

View File

@ -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<RobotInformationMap
@Resource
private RobotCameraService cameraService;
@Resource
private RemoteControllerInformationMapper controllerInformationMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createInformation(RobotInformationSaveReqVO createReqVO) {
@ -246,6 +254,13 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
validateInformationExists(updateReqVO.getId());
RobotInformationDO robotInformationDO = informationMapper.selectById(updateReqVO.getId());
RemoteControllerInformationDO remoteControllerInformation = controllerInformationMapper.selectOne(new LambdaQueryWrapper<RemoteControllerInformationDO>()
.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<RobotInformationMap
return list;
}
/**
* 车辆一键暂停或启动
* @param robotSimulationPose
* @param robotNos
* @param str
*/
@Override
public void sendEmergencyStopOrRecoveryToRobot(RobotSimulationPoseDTO robotSimulationPose, List<String> 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);
}
}
}

View File

@ -94,4 +94,30 @@ public interface RobotMapStopService extends IService<RobotMapStopDO> {
* @return
*/
List<RobotMapStopDO> getAllRobotMapStops(Integer type);
/**
* 根据车辆编号查询暂停信息
* @param robotNo
* @return
*/
List<RobotMapStopDO> getStopRobotNoByRobotNo(String robotNo);
/**
* 远遥暂停车辆
* @param robotNo
* @return
*/
void remoteStopRobot(String robotNo);
/**
* 根据车辆编号删除
* @param robotNos
*/
void deleteRobotMapStopByRobotNos(List<String> robotNos);
/**
* 远遥恢复车辆
* @param robotNo
*/
void remoteRecoveryRobot(String robotNo);
}

View File

@ -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<RobotMapStopMapper, Rob
@Resource
private RobotMapStopMapper mapStopMapper;
@Resource
private RobotInformationService informationService;
@Resource
private PositionMapMapper positionMapMapper;
@Resource
private RedisUtil redisUtil;
@Resource
private UserOperationLogService userOperationLogService;
@Override
public Long createMapStop(RobotMapStopSaveReqVO createReqVO) {
// 插入
@ -96,7 +119,7 @@ public class RobotMapStopServiceImpl extends ServiceImpl<RobotMapStopMapper, Rob
@Override
public List<String> getStopRobotNoByMapIds(Long id) {
List<RobotMapStopDO> positionMapItems = mapStopMapper.selectList(new LambdaQueryWrapperX<RobotMapStopDO>()
.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<RobotMapStopMapper, Rob
}
/**
*
* @param id
* @param robotNos
*/
@ -144,4 +166,93 @@ public class RobotMapStopServiceImpl extends ServiceImpl<RobotMapStopMapper, Rob
.eq(RobotMapStopDO::getStopType, type));
}
@Override
public List<RobotMapStopDO> getStopRobotNoByRobotNo(String robotNo) {
return mapStopMapper.selectList(new LambdaQueryWrapperX<RobotMapStopDO>()
.eq(RobotMapStopDO::getStopType, ZeroOneEnum.ONE.getType())
.eq(RobotMapStopDO::getRobotNo, robotNo));
}
/**
* 远遥暂停车辆
*
* @param robotNo
* @return
*/
@Override
public void remoteStopRobot(String robotNo) {
List<RobotMapStopDO> stopRobotNoByRobotNo = getStopRobotNoByRobotNo(robotNo);
if (ObjectUtil.isNotEmpty(stopRobotNoByRobotNo)) {
throw exception(ROBOT_ALREADY_STOP);
}
RobotSimulationPoseDTO robotSimulationPose = new RobotSimulationPoseDTO();
robotSimulationPose.setCommandType(RobotCommandTypeEnum.EMERGENCY_STOP.getType());
List<String> 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<PositionMapDO>()
.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<String> robotNos) {
mapStopMapper.deleteRobotMapStopByRobotNos(robotNos);
}
/**
* 远遥恢复车辆
*
* @param robotNo
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void remoteRecoveryRobot(String robotNo) {
List<RobotMapStopDO> stopRobotNoByRobotNo = getStopRobotNoByRobotNo(robotNo);
if (ObjectUtil.isEmpty(stopRobotNoByRobotNo)) {
throw exception(ROBOT_ALREADY_RECOVERY);
}
RobotSimulationPoseDTO robotSimulationPose = new RobotSimulationPoseDTO();
robotSimulationPose.setCommandType(RobotCommandTypeEnum.RECOVERY.getType());
List<String> list = Arrays.asList(robotNo);
informationService.sendEmergencyStopOrRecoveryToRobot(robotSimulationPose, list, "远遥恢复车辆");
deleteRobotMapStopByRobotNos(list);
List<RobotMapStopDO> mapStopDOList = mapStopMapper.selectList(new LambdaQueryWrapperX<RobotMapStopDO>()
.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);
}
}
}

View File

@ -16,4 +16,16 @@
where
position_map_id = #{mapId}
</delete>
<delete id="deleteRobotMapStopByRobotNos">
delete
from
robot_map_stop
where
robot_no in
<foreach collection="robotNos" item="robotNo" index="index" open="(" close=")"
separator=",">
#{robotNo}
</foreach>
</delete>
</mapper>