远遥车辆列表

This commit is contained in:
cbs 2025-04-24 18:39:07 +08:00
parent 342038226e
commit 8e04dca496
12 changed files with 116 additions and 82 deletions

View File

@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List; import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@ -31,7 +32,7 @@ public class RemoteRobotController {
@PostMapping("/getAreaRobot") @PostMapping("/getAreaRobot")
@Operation(summary = "获取地图区域对应的机器人信息") @Operation(summary = "获取地图区域对应的机器人信息")
public CommonResult<List<RemoteRobotDTO>> getAreaRobot(@RequestBody PositionMapRespDTO positionMapRespDTO) { public CommonResult<List<RemoteRobotDTO>> getAreaRobot(@Valid @RequestBody PositionMapRespDTO positionMapRespDTO) {
List<RemoteRobotDTO> list = remoteRobotService.remoteGetAreaRobot(positionMapRespDTO); List<RemoteRobotDTO> list = remoteRobotService.remoteGetAreaRobot(positionMapRespDTO);
return success(list); return success(list);
} }
@ -78,5 +79,12 @@ public class RemoteRobotController {
return success(true); return success(true);
} }
@GetMapping("/getMap")
@Operation(summary = "获得仓库点位地图Map")
@PreAuthorize("@ss.hasPermission('system:position-map:getMap')")
public CommonResult<Object> getPositionMapList() {
Object result = remoteRobotService.getPositionMapList();
return success(result);
}
} }

View File

@ -3,8 +3,11 @@ package cn.iocoder.yudao.module.remote.controller.admin.robot.dto;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull;
@Data @Data
public class PositionMapRespDTO { public class PositionMapRespDTO {
@Schema(description = "地图id") @Schema(description = "地图id")
@NotNull(message = "请输入地图id")
private Long id; private Long id;
} }

View File

@ -21,7 +21,7 @@ import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 远遥任务") @Tag(name = "管理后台 - 异常车辆列表")
@RestController @RestController
@RequestMapping("/remote/task") @RequestMapping("/remote/task")
@Validated @Validated

View File

@ -50,4 +50,10 @@ public interface RemoteRobotService {
* @return * @return
*/ */
void robotChangeMode( RemoteRobotChangeModeDTO data,HttpServletRequest request); void robotChangeMode( RemoteRobotChangeModeDTO data,HttpServletRequest request);
/**
* 查询地图
* @return
*/
Object getPositionMapList();
} }

View File

@ -97,4 +97,9 @@ public class RemoteRobotServiceImpl implements RemoteRobotService{
throw exception0(TASK_COMMONG_FAIL.getCode(), result.getMsg()); throw exception0(TASK_COMMONG_FAIL.getCode(), result.getMsg());
} }
} }
@Override
public Object getPositionMapList() {
return remoteRobotApi.getRemotePositionMapList();
}
} }

View File

@ -20,7 +20,7 @@ public interface RemoteRobotApi {
@PostMapping(PREFIX + "/remoteGetAreaRobot") @PostMapping(PREFIX + "/remoteGetAreaRobot")
@Operation(summary = "获取地图区域对应的机器人信息") @Operation(summary = "获取地图区域对应的机器人信息")
List<RemoteRobotDTO> remoteGetAreaRobot(@RequestParam(value = "mapId", defaultValue = "-1") Long mapId); List<RemoteRobotDTO> remoteGetAreaRobot(@RequestParam(value = "mapId") Long mapId);
@PostMapping(PREFIX + "/remoteEmergencyStopOrRecovery") @PostMapping(PREFIX + "/remoteEmergencyStopOrRecovery")
@Operation(summary = "一键急停or一键恢复地图上所有AGV") @Operation(summary = "一键急停or一键恢复地图上所有AGV")
@ -43,4 +43,8 @@ public interface RemoteRobotApi {
CommonResult<Boolean> robotChangeMode(@RequestParam(value = "remoteMode") Integer remoteMode, CommonResult<Boolean> robotChangeMode(@RequestParam(value = "remoteMode") Integer remoteMode,
@RequestParam(value = "ip") String ip, @RequestParam(value = "ip") String ip,
@RequestParam(value = "robotNo") String robotNo); @RequestParam(value = "robotNo") String robotNo);
@PostMapping(PREFIX + "/getRemotePositionMapList")
@Operation(summary = "远遥查询地图")
Object getRemotePositionMapList();
} }

View File

@ -10,17 +10,11 @@ import java.util.List;
@NoArgsConstructor @NoArgsConstructor
public class RemoteRobotDTO { public class RemoteRobotDTO {
@Schema(description = "地图id") @Schema(description = "远遥模式(0:自动模式, 1:手动模式, 2:自由模式)")
private Long id; private Integer remoteMode = 0;
@Schema(description = "楼层") @Schema(description = "车辆数量")
private Integer floor; private Integer robotQuantity = 0;
@Schema(description = "区域")
private String area;
@Schema(description = "地图是否暂停(0:暂停, 1:没暂停)")
private Integer isStop = 1;
@Schema(description = "车辆明细") @Schema(description = "车辆明细")
private List<RemoteRobotDetailDTO> robotList; private List<RemoteRobotDetailDTO> robotList;

View File

@ -12,7 +12,7 @@ public class RemoteRobotDetailDTO {
@Schema(description = "上传图片附件", example = "https://www.iocoder.cn") @Schema(description = "上传图片附件", example = "https://www.iocoder.cn")
private String url; private String url;
@Schema(description = "任务模式0拒收任务、1正常", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "任务模式0锁定、1正常", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer robotTaskModel; private Integer robotTaskModel;
@Schema(description = "车辆状态(2任务中、3待命、4:充电中)") @Schema(description = "车辆状态(2任务中、3待命、4:充电中)")
@ -21,6 +21,6 @@ public class RemoteRobotDetailDTO {
@Schema(description = "任务号") @Schema(description = "任务号")
private String taskNo; private String taskNo;
@Schema(description = "远遥模式(0:自动模式, 1:手动模式, 2:自由模式)") @Schema(description = "车辆模式(0:自动模式, 1:手动模式, 2:自由模式)")
private Integer remoteMode = 0; private Integer remoteMode = 0;
} }

View File

@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.api.remote;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; 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.RemoteRobotDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotStatusDTO; import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotStatusDTO;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapDTO;
import cn.iocoder.yudao.module.system.service.positionmap.PositionMapService; 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.remote.RemoteControllerInformationService;
import cn.iocoder.yudao.module.system.service.robot.mapstop.RobotMapStopService; import cn.iocoder.yudao.module.system.service.robot.mapstop.RobotMapStopService;
@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List; import java.util.List;
import java.util.Map;
@Slf4j @Slf4j
@RestController // 提供 RESTful API 接口 Feign 调用 @RestController // 提供 RESTful API 接口 Feign 调用
@ -98,5 +100,11 @@ public class RemoteRobotApiImpl implements RemoteRobotApi {
return CommonResult.success(true); return CommonResult.success(true);
} }
@Override
public Object getRemotePositionMapList() {
Map<Integer, List<PositionMapDTO>> result = positionMapService.getPositionMapList();
return result;
}
} }

View File

@ -24,6 +24,7 @@ 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.positionmap.PositionMapMapper;
import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum; import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotStatusEnum; import cn.iocoder.yudao.module.system.enums.robot.RobotStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.remote.RemoteModeEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotCommandTypeEnum; 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.log.UserOperationLogService;
import cn.iocoder.yudao.module.system.service.remote.RemoteControllerInformationService; import cn.iocoder.yudao.module.system.service.remote.RemoteControllerInformationService;
@ -344,7 +345,7 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void emergencyStopOrRecovery(Long id, Integer type,Boolean isRemote) { public void emergencyStopOrRecovery(Long id, Integer type, Boolean isRemote) {
// 先获取当前地图上的所有AGV信息 // 先获取当前地图上的所有AGV信息
PositionMapDO positionMapDO = positionMapMapper.selectById(id); PositionMapDO positionMapDO = positionMapMapper.selectById(id);
@ -360,7 +361,7 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
str = RobotCommandTypeEnum.EMERGENCY_STOP.getMsg(); str = RobotCommandTypeEnum.EMERGENCY_STOP.getMsg();
if (isRemote) { if (isRemote) {
mapStr = "远遥一键暂停 " + mapStr; mapStr = "远遥一键暂停 " + mapStr;
}else { } else {
mapStr = "一键暂停 " + mapStr; mapStr = "一键暂停 " + mapStr;
} }
@ -380,7 +381,7 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
str = RobotCommandTypeEnum.RECOVERY.getMsg(); str = RobotCommandTypeEnum.RECOVERY.getMsg();
if (isRemote) { if (isRemote) {
mapStr = "远遥一键恢复 " + mapStr; mapStr = "远遥一键恢复 " + mapStr;
}else { } else {
mapStr = "一键恢复 " + mapStr; mapStr = "一键恢复 " + mapStr;
} }
robotMapStopService.deleteRobotMapStopByMapId(id); robotMapStopService.deleteRobotMapStopByMapId(id);
@ -409,7 +410,6 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
} }
@Override @Override
public List<PositionMapDO> getAllMap() { public List<PositionMapDO> getAllMap() {
return positionMapMapper.selectList(new LambdaQueryWrapperX<PositionMapDO>().orderByDesc(PositionMapDO::getId)); return positionMapMapper.selectList(new LambdaQueryWrapperX<PositionMapDO>().orderByDesc(PositionMapDO::getId));
@ -446,9 +446,16 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
@Override @Override
public List<RemoteRobotDTO> getRemoteAreaRobotByMapId(Long mapId) { public List<RemoteRobotDTO> getRemoteAreaRobotByMapId(Long mapId) {
List<RobotInformationDO> allRobot = informationService.getAllRobot(); PositionMapDO positionMapDO = positionMapMapper.selectById(mapId);
List<String> robotNos =
informationService.getRobotByFloorAndArea(String.valueOf(positionMapDO.getFloor()), positionMapDO.getArea());
if (ObjectUtil.isEmpty(robotNos)) {
return new ArrayList<>();
}
List<RobotInformationDO> allRobot = informationService.getRobotInformationByRobotNos(robotNos);
List<RobotDoingTaskDTO> robotDoingTask = taskDetailService.getRobotDoingTaskNo(); List<RobotDoingTaskDTO> robotDoingTask = taskDetailService.getRobotDoingTaskNo();
List<RobotMapStopDO> robotMapStops = mapStopService.getAllRobotMapStops(ZeroOneEnum.ZERO.getType());
List<RemoteControllerInformationDO> remoteControllerInformations = controllerInformationService.getAllRemoteController(); List<RemoteControllerInformationDO> remoteControllerInformations = controllerInformationService.getAllRemoteController();
@ -463,79 +470,65 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
robotDoingTaskMap = robotDoingTask.stream().collect(Collectors.toMap(RobotDoingTaskDTO::getRobotNo, Function.identity())); robotDoingTaskMap = robotDoingTask.stream().collect(Collectors.toMap(RobotDoingTaskDTO::getRobotNo, Function.identity()));
} }
List<Long> stopMapIds = null;
if (ObjectUtil.isNotEmpty(robotMapStops)) {
stopMapIds = robotMapStops.stream().map(RobotMapStopDO::getPositionMapId).collect(Collectors.toList());
}
Map<String, RemoteControllerInformationDO> remoteMap = null; Map<String, RemoteControllerInformationDO> remoteMap = null;
if (ObjectUtil.isNotEmpty(remoteControllerInformations)) { if (ObjectUtil.isNotEmpty(remoteControllerInformations)) {
remoteMap = remoteControllerInformations.stream().collect(Collectors.toMap(RemoteControllerInformationDO::getRobotNo, Function.identity())); remoteMap = remoteControllerInformations.stream().collect(Collectors.toMap(RemoteControllerInformationDO::getRobotNo, Function.identity()));
} }
if (ObjectUtil.isEmpty(mapId) || mapId < 0) { return getRemoteSingleMapInfomation(robotMap, robotNos,
List<PositionMapDO> allMap = positionMapMapper.selectList(new LambdaQueryWrapperX<PositionMapDO>().orderByDesc(PositionMapDO::getFloor)); robotDoingTaskMap,
if (ObjectUtil.isEmpty(allMap)) { remoteMap);
return new ArrayList<>();
}
return getRemoteAllMapInfomation(allMap, robotMap, robotDoingTaskMap, stopMapIds, remoteMap);
} else {
PositionMapDO positionMapDO = positionMapMapper.selectById(mapId);
RemoteRobotDTO remoteRobot = getRemoteSingleMapInfomation(positionMapDO, robotMap,
robotDoingTaskMap, stopMapIds,
remoteMap);
return Collections.singletonList(remoteRobot);
}
} }
private List<RemoteRobotDTO> getRemoteAllMapInfomation(List<PositionMapDO> allMap, Map<String, RobotInformationDO> robotMap, private List<RemoteRobotDTO> getRemoteSingleMapInfomation(Map<String, RobotInformationDO> robotMap, List<String> robotNos,
Map<String, RobotDoingTaskDTO> robotDoingTaskMap, List<Long> stopMapIds, Map<String, RobotDoingTaskDTO> robotDoingTaskMap,
Map<String, RemoteControllerInformationDO> remoteMap) {
List<RemoteRobotDTO> remoteRobotList = new ArrayList<>();
for (PositionMapDO positionMapDO : allMap) {
RemoteRobotDTO remoteRobotDTO = getRemoteSingleMapInfomation(positionMapDO, robotMap, robotDoingTaskMap, stopMapIds, remoteMap);
remoteRobotList.add(remoteRobotDTO);
}
return remoteRobotList;
}
private RemoteRobotDTO getRemoteSingleMapInfomation(PositionMapDO positionMapDO, Map<String, RobotInformationDO> robotMap,
Map<String, RobotDoingTaskDTO> robotDoingTaskMap, List<Long> stopMapIds,
Map<String, RemoteControllerInformationDO> remoteMap) { Map<String, RemoteControllerInformationDO> remoteMap) {
List<String> robotNos = RemoteRobotDTO automatic = new RemoteRobotDTO();
informationService.getRobotByFloorAndArea(String.valueOf(positionMapDO.getFloor()), positionMapDO.getArea()); RemoteRobotDTO handMovement = new RemoteRobotDTO();
RemoteRobotDTO remoteRobotDTO = new RemoteRobotDTO(); RemoteRobotDTO free = new RemoteRobotDTO();
remoteRobotDTO.setId(positionMapDO.getId()); List<RemoteRobotDetailDTO> automaticDetail = new ArrayList<>();
remoteRobotDTO.setFloor(positionMapDO.getFloor()); List<RemoteRobotDetailDTO> handMovementDetail = new ArrayList<>();
remoteRobotDTO.setArea(positionMapDO.getArea()); List<RemoteRobotDetailDTO> freeDetail = new ArrayList<>();
if (ObjectUtil.isNotEmpty(robotNos) && ObjectUtil.isNotEmpty(robotMap)) {
List<RemoteRobotDetailDTO> robotList = new ArrayList<>();
for (String robotNo : robotNos) {
RobotInformationDO robotInformation = robotMap.get(robotNo);
if (ObjectUtil.isEmpty(robotInformation)) {
continue;
}
RemoteRobotDetailDTO remoteRobotDetail = BeanUtils.toBean(robotInformation, RemoteRobotDetailDTO.class);
if (ObjectUtil.isNotEmpty(robotDoingTaskMap) && ObjectUtil.isNotEmpty(robotDoingTaskMap.get(robotNo))) {
remoteRobotDetail.setTaskNo(robotDoingTaskMap.get(robotNo).getTaskNo());
} else if (RobotStatusEnum.DOING.getType().equals(robotInformation.getRobotStatus())) {
remoteRobotDetail.setTaskNo("车辆正在做移动任务");
} else if (RobotStatusEnum.CHARGE.getType().equals(robotInformation.getRobotStatus())) {
remoteRobotDetail.setTaskNo("车辆正在做充电任务");
}
if (ObjectUtil.isNotEmpty(remoteMap) && ObjectUtil.isNotEmpty(remoteMap.get(robotNo))) { for (String robotNo : robotNos) {
remoteRobotDetail.setRemoteMode(remoteMap.get(robotNo).getRemoteMode()); RobotInformationDO robotInformation = robotMap.get(robotNo);
} if (ObjectUtil.isEmpty(robotInformation)) {
robotList.add(remoteRobotDetail); continue;
}
RemoteRobotDetailDTO remoteRobotDetail = BeanUtils.toBean(robotInformation, RemoteRobotDetailDTO.class);
if (ObjectUtil.isNotEmpty(robotDoingTaskMap) && ObjectUtil.isNotEmpty(robotDoingTaskMap.get(robotNo))) {
remoteRobotDetail.setTaskNo(robotDoingTaskMap.get(robotNo).getTaskNo());
} else if (RobotStatusEnum.DOING.getType().equals(robotInformation.getRobotStatus())) {
remoteRobotDetail.setTaskNo("车辆正在做移动任务");
} else if (RobotStatusEnum.CHARGE.getType().equals(robotInformation.getRobotStatus())) {
remoteRobotDetail.setTaskNo("车辆正在做充电任务");
}
if (ObjectUtil.isNotEmpty(remoteMap) && ObjectUtil.isNotEmpty(remoteMap.get(robotNo))) {
remoteRobotDetail.setRemoteMode(remoteMap.get(robotNo).getRemoteMode());
}
if (RemoteModeEnum.AUTOMATIC.getType().equals(remoteRobotDetail.getRemoteMode())) {
automaticDetail.add(remoteRobotDetail);
}else if (RemoteModeEnum.HAND_MOVEMENT.getType().equals(remoteRobotDetail.getRemoteMode())) {
handMovementDetail.add(remoteRobotDetail);
}else {
freeDetail.add(remoteRobotDetail);
} }
remoteRobotDTO.setRobotList(robotList);
} }
if (ObjectUtil.isNotEmpty(stopMapIds) && stopMapIds.contains(positionMapDO.getId())) { automatic.setRemoteMode(RemoteModeEnum.AUTOMATIC.getType());
remoteRobotDTO.setIsStop(ZeroOneEnum.ZERO.getType()); automatic.setRobotQuantity(automaticDetail.size());
} automatic.setRobotList(automaticDetail);
return remoteRobotDTO; handMovement.setRemoteMode(RemoteModeEnum.HAND_MOVEMENT.getType());
handMovement.setRobotQuantity(handMovementDetail.size());
handMovement.setRobotList(handMovementDetail);
free.setRemoteMode(RemoteModeEnum.FREE.getType());
free.setRobotQuantity(freeDetail.size());
free.setRobotList(freeDetail);
return Arrays.asList(automatic,handMovement,free);
} }
} }

View File

@ -199,4 +199,11 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
* @return * @return
*/ */
Boolean checkRobotElectricity(RobotInformationDO information, CommonConfigDO commonConfig); Boolean checkRobotElectricity(RobotInformationDO information, CommonConfigDO commonConfig);
/**
* 根据车辆编号查询
* @param robotNos
* @return
*/
List<RobotInformationDO> getRobotInformationByRobotNos(List<String> robotNos);
} }

View File

@ -1392,6 +1392,12 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
return checkElectricity(chargeConfig, robotInformation, dataPoseDTO); return checkElectricity(chargeConfig, robotInformation, dataPoseDTO);
} }
@Override
public List<RobotInformationDO> getRobotInformationByRobotNos(List<String> robotNos) {
return informationMapper.selectList(new LambdaQueryWrapperX<RobotInformationDO>()
.in(RobotInformationDO::getRobotNo, robotNos));
}
private Boolean checkElectricity(CommonConfigVO chargeConfig, RobotInformationDO robot, RobotStatusDataPoseDTO dataPoseDTO) { private Boolean checkElectricity(CommonConfigVO chargeConfig, RobotInformationDO robot, RobotStatusDataPoseDTO dataPoseDTO) {
String chargeModelKey = RobotTaskChcheConstant.ROBOT_CHARGE_MODEL + robot.getRobotNo(); String chargeModelKey = RobotTaskChcheConstant.ROBOT_CHARGE_MODEL + robot.getRobotNo();
Object chargeModelCache = redisUtil.get(chargeModelKey); Object chargeModelCache = redisUtil.get(chargeModelKey);