远遥车辆列表

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.validation.Valid;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@ -31,7 +32,7 @@ public class RemoteRobotController {
@PostMapping("/getAreaRobot")
@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);
return success(list);
}
@ -78,5 +79,12 @@ public class RemoteRobotController {
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 lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class PositionMapRespDTO {
@Schema(description = "地图id")
@NotNull(message = "请输入地图id")
private Long id;
}

View File

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

View File

@ -50,4 +50,10 @@ public interface RemoteRobotService {
* @return
*/
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());
}
}
@Override
public Object getPositionMapList() {
return remoteRobotApi.getRemotePositionMapList();
}
}

View File

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

View File

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

View File

@ -12,7 +12,7 @@ public class RemoteRobotDetailDTO {
@Schema(description = "上传图片附件", example = "https://www.iocoder.cn")
private String url;
@Schema(description = "任务模式0拒收任务、1正常", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "任务模式0锁定、1正常", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer robotTaskModel;
@Schema(description = "车辆状态(2任务中、3待命、4:充电中)")
@ -21,6 +21,6 @@ public class RemoteRobotDetailDTO {
@Schema(description = "任务号")
private String taskNo;
@Schema(description = "远遥模式(0:自动模式, 1:手动模式, 2:自由模式)")
@Schema(description = "车辆模式(0:自动模式, 1:手动模式, 2:自由模式)")
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.module.system.api.remote.dto.RemoteRobotDTO;
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.remote.RemoteControllerInformationService;
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 java.util.List;
import java.util.Map;
@Slf4j
@RestController // 提供 RESTful API 接口 Feign 调用
@ -98,5 +100,11 @@ public class RemoteRobotApiImpl implements RemoteRobotApi {
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.enums.common.ZeroOneEnum;
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.service.log.UserOperationLogService;
import cn.iocoder.yudao.module.system.service.remote.RemoteControllerInformationService;
@ -344,7 +345,7 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
@Override
@Transactional(rollbackFor = Exception.class)
public void emergencyStopOrRecovery(Long id, Integer type,Boolean isRemote) {
public void emergencyStopOrRecovery(Long id, Integer type, Boolean isRemote) {
// 先获取当前地图上的所有AGV信息
PositionMapDO positionMapDO = positionMapMapper.selectById(id);
@ -360,7 +361,7 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
str = RobotCommandTypeEnum.EMERGENCY_STOP.getMsg();
if (isRemote) {
mapStr = "远遥一键暂停 " + mapStr;
}else {
} else {
mapStr = "一键暂停 " + mapStr;
}
@ -380,7 +381,7 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
str = RobotCommandTypeEnum.RECOVERY.getMsg();
if (isRemote) {
mapStr = "远遥一键恢复 " + mapStr;
}else {
} else {
mapStr = "一键恢复 " + mapStr;
}
robotMapStopService.deleteRobotMapStopByMapId(id);
@ -409,7 +410,6 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
}
@Override
public List<PositionMapDO> getAllMap() {
return positionMapMapper.selectList(new LambdaQueryWrapperX<PositionMapDO>().orderByDesc(PositionMapDO::getId));
@ -446,9 +446,16 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
@Override
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<RobotMapStopDO> robotMapStops = mapStopService.getAllRobotMapStops(ZeroOneEnum.ZERO.getType());
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()));
}
List<Long> stopMapIds = null;
if (ObjectUtil.isNotEmpty(robotMapStops)) {
stopMapIds = robotMapStops.stream().map(RobotMapStopDO::getPositionMapId).collect(Collectors.toList());
}
Map<String, RemoteControllerInformationDO> remoteMap = null;
if (ObjectUtil.isNotEmpty(remoteControllerInformations)) {
remoteMap = remoteControllerInformations.stream().collect(Collectors.toMap(RemoteControllerInformationDO::getRobotNo, Function.identity()));
}
if (ObjectUtil.isEmpty(mapId) || mapId < 0) {
List<PositionMapDO> allMap = positionMapMapper.selectList(new LambdaQueryWrapperX<PositionMapDO>().orderByDesc(PositionMapDO::getFloor));
if (ObjectUtil.isEmpty(allMap)) {
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);
}
return getRemoteSingleMapInfomation(robotMap, robotNos,
robotDoingTaskMap,
remoteMap);
}
private List<RemoteRobotDTO> getRemoteAllMapInfomation(List<PositionMapDO> allMap, Map<String, RobotInformationDO> robotMap,
Map<String, RobotDoingTaskDTO> robotDoingTaskMap, List<Long> stopMapIds,
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,
private List<RemoteRobotDTO> getRemoteSingleMapInfomation(Map<String, RobotInformationDO> robotMap, List<String> robotNos,
Map<String, RobotDoingTaskDTO> robotDoingTaskMap,
Map<String, RemoteControllerInformationDO> remoteMap) {
List<String> robotNos =
informationService.getRobotByFloorAndArea(String.valueOf(positionMapDO.getFloor()), positionMapDO.getArea());
RemoteRobotDTO remoteRobotDTO = new RemoteRobotDTO();
remoteRobotDTO.setId(positionMapDO.getId());
remoteRobotDTO.setFloor(positionMapDO.getFloor());
remoteRobotDTO.setArea(positionMapDO.getArea());
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("车辆正在做充电任务");
}
RemoteRobotDTO automatic = new RemoteRobotDTO();
RemoteRobotDTO handMovement = new RemoteRobotDTO();
RemoteRobotDTO free = new RemoteRobotDTO();
List<RemoteRobotDetailDTO> automaticDetail = new ArrayList<>();
List<RemoteRobotDetailDTO> handMovementDetail = new ArrayList<>();
List<RemoteRobotDetailDTO> freeDetail = new ArrayList<>();
if (ObjectUtil.isNotEmpty(remoteMap) && ObjectUtil.isNotEmpty(remoteMap.get(robotNo))) {
remoteRobotDetail.setRemoteMode(remoteMap.get(robotNo).getRemoteMode());
}
robotList.add(remoteRobotDetail);
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))) {
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())) {
remoteRobotDTO.setIsStop(ZeroOneEnum.ZERO.getType());
}
automatic.setRemoteMode(RemoteModeEnum.AUTOMATIC.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
*/
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);
}
@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) {
String chargeModelKey = RobotTaskChcheConstant.ROBOT_CHARGE_MODEL + robot.getRobotNo();
Object chargeModelCache = redisUtil.get(chargeModelKey);