远遥查询车辆功能

This commit is contained in:
cbs 2025-04-29 16:56:27 +08:00
parent 681d8d7dc2
commit a1cf7a9953
23 changed files with 354 additions and 56 deletions

View File

@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.remote.controller.admin.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.controller.admin.robot.dto.RemoteRobotChangeModeDTO;
import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.RemoteRobotTaskDoneDTO;
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;
@ -95,4 +96,14 @@ public class RemoteRobotController {
remoteRobotService.remoteDisconnect(request);
return success(true);
}
@PostMapping("/taskDone")
@Operation(summary = "任务完成/取货完成")
@PreAuthorize("@ss.hasPermission('remote:robot:taskDone')")
public CommonResult<Boolean> remoteTaskDone(@Valid @RequestBody RemoteRobotTaskDoneDTO remoteRobotTaskDoneDTO,
HttpServletRequest request) {
remoteRobotService.remoteTaskDone(remoteRobotTaskDoneDTO,request);
return success(true);
}
}

View File

@ -0,0 +1,14 @@
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 RemoteRobotTaskDoneDTO {
@Schema(description = "取货完成: 0, 任务完成: 1")
@NotNull(message = "请选择是取货完成还是任务完成")
private Integer mode = 0;
}

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.remote.service.robot;
import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.PositionMapRespDTO;
import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.RemoteRobotChangeModeDTO;
import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.RemoteRobotTaskDoneDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteRobotStatusDTO;
@ -62,4 +63,11 @@ public interface RemoteRobotService {
* @param request
*/
void remoteDisconnect(HttpServletRequest request);
/**
* 任务完成/取货完成
* @param remoteRobotTaskDoneDTO
* @param request
*/
void remoteTaskDone( RemoteRobotTaskDoneDTO remoteRobotTaskDoneDTO, HttpServletRequest request);
}

View File

@ -3,6 +3,7 @@ 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.controller.admin.robot.dto.RemoteRobotChangeModeDTO;
import cn.iocoder.yudao.module.remote.controller.admin.robot.dto.RemoteRobotTaskDoneDTO;
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;
@ -15,7 +16,6 @@ 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
@ -115,4 +115,18 @@ public class RemoteRobotServiceImpl implements RemoteRobotService{
throw exception0(TASK_COMMONG_FAIL.getCode(), result.getMsg());
}
}
/**
* 任务完成/取货完成
* @param remoteRobotTaskDoneDTO
* @param request
*/
@Override
public void remoteTaskDone(RemoteRobotTaskDoneDTO remoteRobotTaskDoneDTO, HttpServletRequest request) {
String ip = IpUtils.getIp(request);
CommonResult<Boolean> result = remoteRobotApi.remoteTaskDone(ip,remoteRobotTaskDoneDTO.getMode());
if (!result.isSuccess()){
throw exception0(TASK_COMMONG_FAIL.getCode(), result.getMsg());
}
}
}

View File

@ -51,4 +51,8 @@ public interface RemoteRobotApi {
@PostMapping(PREFIX + "/remoteDisconnect")
@Operation(summary = "断开连接")
CommonResult<Boolean> remoteDisconnect(@RequestParam(value = "remoteIp") String remoteIp);
@PostMapping(PREFIX + "/remoteTaskDone")
@Operation(summary = "任务完成/取货完成")
CommonResult<Boolean> remoteTaskDone(@RequestParam(value = "remoteIp") String remoteIp, @RequestParam(value = "mode") Integer mode);
}

View File

@ -20,18 +20,15 @@ public class RemoteRobotStatusDTO {
@Schema(description = "协控(0:关闭协控, 1:开启协控, 2:不显示协控)")
private Integer collaborativeControl = 0;
@Schema(description = "是否可以点击: 任务完成(0:可以点, 1:不能点任务完成, 2:不显示任务完成按钮)")
private Integer clickTaskDone = 1;
@Schema(description = "车辆任务状态(3待命 , 其他都是任务中)")
private Integer robotStatus = 2;
@Schema(description = "任务模式0锁定、1正常")
private Integer robotTaskModel;
@Schema(description = "是否可以点击: 异常处理(0:可以点, 1:不能点, 2:不显示异常处理)")
@Schema(description = "是否可以点击: 异常处理(0:显示异常处理, 1:不显示异常处理)")
private Integer clickException = 1;
@Schema(description = "是否可以点击: 取货完成(0:可以点, 1:不能点, 2:不显示取货完成)")
private Integer clickTakeDone = 1;
@Schema(description = "是否可以点击( 0: 显示取货完成按钮, 1:显示任务完成按钮 , 2: 不显示任务完成按钮)")
private Integer clickTaskDone = 2;
}

View File

@ -225,6 +225,7 @@ public interface ErrorCodeConstants {
// ========== 机器人任务明细 1-002-036-000 ==========
ErrorCode TASK_DETAIL_NOT_EXISTS = new ErrorCode(1-002-036-001, "车辆任务明细不存在");
ErrorCode TASK_DETAIL_CHANGE_ROBOT = new ErrorCode(1-002-036-002, "非新单据不能修改车辆");
ErrorCode TASK_NOT_TAKE_RELEASE = new ErrorCode(1-002-036-003, "非取货任务,不能点击取货完成");
// ========== 机器人任务明细 1-002-037-000 ==========
ErrorCode REDISSON_NOT_OBTAIN_LOCK = new ErrorCode(1-002-037-001, "有正在下发中的任务请稍后重试!");
@ -292,6 +293,9 @@ public interface ErrorCodeConstants {
ErrorCode REMOTE_TASK_HAVE_CHOOSE = new ErrorCode(1_002_053_011, "此任务已经被远遥设备选中");
ErrorCode REMOTE_TASK_NOT_OCCUR_ERROR = new ErrorCode(1_002_053_012, "此任务未发发生4级异常");
ErrorCode REMOTE_TASK_NOT_TAKE_RELEASE = new ErrorCode(1_002_053_013, "非取货或者放货任务,不能转移");
ErrorCode REMOTE_ALREADY_CHOOSE_ROBOT = new ErrorCode(1_002_053_014, "此车辆已经被其他远遥设备控制中");
ErrorCode REMOTE_ROBOT_HAVE_MORE_TASK = new ErrorCode(1_002_053_015, "此车辆有一个以上的处理中任务,请先检查数据");
ErrorCode REMOTE_ROBOT_HAVE_NOT_TASK = new ErrorCode(1_002_053_016, "此车辆没有处理中的任务");
// ========== 车辆摄像头信息 1_002_054_001 ==========
ErrorCode CAMERA_NOT_EXISTS = new ErrorCode(1_002_054_001, "车辆摄像头信息不存在");

View File

@ -108,6 +108,7 @@ public class RemoteRobotApiImpl implements RemoteRobotApi {
/**
* 断开连接
*
* @param remoteIp
* @return
*/
@ -117,5 +118,18 @@ public class RemoteRobotApiImpl implements RemoteRobotApi {
return CommonResult.success(true);
}
/**
* 任务完成/取货完成
*
* @param remoteIp
* @param mode
* @return
*/
@Override
public CommonResult<Boolean> remoteTaskDone(String remoteIp, Integer mode) {
controllerInformationService.remoteTaskDone(remoteIp, mode);
return CommonResult.success(true);
}
}

View File

@ -96,7 +96,7 @@ public class RobotTaskDetailController {
@Operation(summary = "人工完成")
@PreAuthorize("@ss.hasPermission('robot:task-detail:manuallyCompleted')")
public CommonResult manuallyCompleted(@RequestParam("id") Long id) {
taskDetailService.manuallyCompleted(id);
taskDetailService.manuallyCompleted(id,"人工完成");
return success(true);
}

View File

@ -10,4 +10,16 @@ public class RobotDoingTaskDTO {
@Schema(description = "AGV编号")
private String robotNo;
@Schema(description = "robot_task_detail的id")
private Long id;
@Schema(description = "任务类型1取放货、2停车、 3充电、4移动、5仅取货、6仅放货、7扫描码、8检测托盘类型、9: 移动到点位)", example = "2")
private Integer taskType;
@Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)", example = "1")
private Integer taskStatus;
@Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3前往放货、4放货中、5结束、6移动中、7:正在充电、8:取消、9:人工完成、10:异常)")
private Long taskStage;
}

View File

@ -28,4 +28,9 @@ public interface RemoteControllerInformationMapper extends BaseMapperX<RemoteCon
.orderByDesc(RemoteControllerInformationDO::getId));
}
/**
* 获取远遥的车辆编号
* @return
*/
List<String> getRemoteControllerRobotNos();
}

View File

@ -148,7 +148,7 @@ public interface RobotTaskDetailMapper extends BaseMapperX<RobotTaskDetailDO> {
* 获取机器人正在做的任务
* @return
*/
List<RobotDoingTaskDTO> getRobotDoingTaskNo();
List<RobotDoingTaskDTO> getRobotDoingTaskNo(@Param("robotNo") String robotNo);
/**

View File

@ -101,6 +101,7 @@ public class RobotTaskDetailActionLogServiceImpl implements RobotTaskDetailActio
public RobotTaskDetailActionLogDO setPreviousTaskDoneByOrderId(Long orderId) {
RobotTaskDetailActionLogDO lastLog = taskDetailActionLogMapper.selectOne(new LambdaQueryWrapperX<RobotTaskDetailActionLogDO>()
.eq(RobotTaskDetailActionLogDO::getTaskDetailId, orderId)
.ne(RobotTaskDetailActionLogDO::getCommandId, -1)
.orderByDesc(RobotTaskDetailActionLogDO::getCreateTime)
.last("limit 1"));
if (ObjectUtil.isNotEmpty(lastLog) && ObjectUtil.isEmpty(lastLog.getCommandId())) {

View File

@ -453,7 +453,7 @@ public class PositionMapServiceImpl extends ServiceImpl<PositionMapMapper, Posit
List<RobotInformationDO> allRobot = informationService.getRobotInformationByRobotNos(robotNos);
List<RobotDoingTaskDTO> robotDoingTask = taskDetailService.getRobotDoingTaskNo();
List<RobotDoingTaskDTO> robotDoingTask = taskDetailService.getRobotDoingTaskNo(null);
List<RemoteControllerInformationDO> remoteControllerInformations = controllerInformationService.getAllRemoteController();

View File

@ -128,4 +128,13 @@ public interface RemoteControllerInformationService extends IService<RemoteContr
* @param message
*/
void repeatedTransmissionDisconnect(RemoteSendMessage message);
/**
* 任务完成/取货完成
* @param remoteIp
* @param mode
*/
void remoteTaskDone(String remoteIp, Integer mode);
List<String> getRemoteControllerRobotNos();
}

View File

@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.system.controller.admin.log.vo.UserOperationLogSa
import cn.iocoder.yudao.module.system.controller.admin.remote.vo.ControllerTaskTransferLogSaveReqVO;
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.controller.admin.robot.detail.RobotDoingTaskDTO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.config.CommonConfigDO;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO;
@ -28,15 +29,15 @@ import cn.iocoder.yudao.module.system.dal.mysql.config.CommonConfigMapper;
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.config.CommandConfigTypeEnum;
import cn.iocoder.yudao.module.system.enums.path.PathTaskTypeEnum;
import cn.iocoder.yudao.module.system.enums.redis.RobotCacheLockEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskModelEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskTypeEnum;
import cn.iocoder.yudao.module.system.enums.robot.actionlog.ActionStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.remote.RemoteModeEnum;
import cn.iocoder.yudao.module.system.enums.robot.remote.RemoteOperationModeEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotCommandTypeEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaskStageEnum;
import cn.iocoder.yudao.module.system.mq.message.RemoteSendMessage;
import cn.iocoder.yudao.module.system.mq.producer.remote.RemoteControllerProducer;
import cn.iocoder.yudao.module.system.service.log.RobotTaskDetailActionLogService;
@ -50,7 +51,6 @@ import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@ -59,6 +59,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@ -241,13 +242,6 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
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());
}
RobotInformationDO robotInformation = informationService.getInformationByRobotNo(information.getRobotNo());
if (RobotStatusEnum.STAND_BY.getType().equals(robotInformation.getRobotStatus())) {
@ -255,6 +249,34 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
}
remoteRobotStatus.setRobotTaskModel(robotInformation.getRobotTaskModel());
if ((RemoteModeEnum.AUTOMATIC.getType().equals(information.getRemoteMode()) || RemoteModeEnum.FREE.getType().equals(information.getRemoteMode()))
&& RobotStatusEnum.STAND_BY.getType().equals(robotInformation.getRobotStatus())) {
remoteRobotStatus.setClickException(ZeroOneEnum.ZERO.getType());
}
if (RemoteModeEnum.HAND_MOVEMENT.getType().equals(information.getRemoteMode())) {
List<RobotDoingTaskDTO> robotDoingTaskNo = taskDetailService.getRobotDoingTaskNo(information.getRobotNo());
if ((ObjectUtil.isNotEmpty(robotDoingTaskNo) && robotDoingTaskNo.size() > 1) || ObjectUtil.isEmpty(robotDoingTaskNo)) {
return remoteRobotStatus;
}
RobotDoingTaskDTO robotDoingTask = robotDoingTaskNo.get(0);
if (!(RobotTaskStatusEnum.DOING.getType().equals(robotDoingTask.getTaskStatus())
&& (RobotTaskTypeEnum.TAKE_RELEASE.getType().equals(robotDoingTask.getTaskType())
|| RobotTaskTypeEnum.TAKE.getType().equals(robotDoingTask.getTaskType())
|| RobotTaskTypeEnum.RELEASE.getType().equals(robotDoingTask.getTaskType())))) {
return remoteRobotStatus;
}
if (RobotTaskStageEnum.UN_START.getType().equals(robotDoingTask.getTaskStage())
|| RobotTaskStageEnum.GO_TAKE.getType().equals(robotDoingTask.getTaskStage())
|| RobotTaskStageEnum.TAKEING.getType().equals(robotDoingTask.getTaskStage())) {
remoteRobotStatus.setClickTaskDone(ZeroOneEnum.ZERO.getType());
}else {
remoteRobotStatus.setClickTaskDone(ZeroOneEnum.ONE.getType());
}
}
return remoteRobotStatus;
}
@ -331,6 +353,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
/**
* 车辆换图修改限速
*
* @param pathPosedsDTO
*/
@Override
@ -346,6 +369,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
/**
* 断开连接
*
* @param remoteIp
*/
@Override
@ -360,7 +384,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
checkGraphMatch(information.getRobotNo());
String robotNo = information.getRobotNo();
sendRemoteMsgToPP(robotNo,PathPlanningTopicConstant.CLOSE_REMOTE_CONTROLLER,RemoteOperationModeEnum.AUTO.getType());
sendRemoteMsgToPP(robotNo, PathPlanningTopicConstant.CLOSE_REMOTE_CONTROLLER, RemoteOperationModeEnum.AUTO.getType());
sendModeToRobot(robotNo, RemoteOperationModeEnum.AUTO.getType());
information.setRobotNo(null);
@ -370,7 +394,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
controllerInformationMapper.updateById(information);
UserOperationLogSaveReqVO build = UserOperationLogSaveReqVO.builder()
.operateAction("远遥断开连接 "+ information.getRemoteIp())
.operateAction("远遥断开连接 " + information.getRemoteIp())
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
userOperationLogService.createUserOperationLog(build);
@ -381,10 +405,56 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
@Override
public void repeatedTransmissionDisconnect(RemoteSendMessage message) {
String robotNo = message.getRobotNo();
sendRemoteMsgToPP(robotNo,PathPlanningTopicConstant.CLOSE_REMOTE_CONTROLLER,RemoteOperationModeEnum.AUTO.getType());
sendRemoteMsgToPP(robotNo, PathPlanningTopicConstant.CLOSE_REMOTE_CONTROLLER, RemoteOperationModeEnum.AUTO.getType());
sendModeToRobot(robotNo, RemoteOperationModeEnum.AUTO.getType());
}
/**
* 任务完成/取货完成
*
* @param remoteIp
* @param mode
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void remoteTaskDone(String remoteIp, Integer mode) {
RemoteControllerInformationDO information = checkRemoteControllerHaveBinding(remoteIp);
List<RobotDoingTaskDTO> robotDoingTaskNo = taskDetailService.getRobotDoingTaskNo(information.getRobotNo());
if (ObjectUtil.isNotEmpty(robotDoingTaskNo) && robotDoingTaskNo.size() > 1) {
throw exception(REMOTE_ROBOT_HAVE_MORE_TASK);
} else if (ObjectUtil.isEmpty(robotDoingTaskNo)) {
throw exception(REMOTE_ROBOT_HAVE_NOT_TASK);
}
//取货完成
if (ZeroOneEnum.ZERO.getType().equals(mode)) {
taskDetailService.remoteTaskTakeDone(robotDoingTaskNo.get(0).getId());
} else {
//任务完成
taskDetailService.manuallyCompleted(robotDoingTaskNo.get(0).getId(), " 远遥点击任务完成 ");
}
}
@Override
public List<String> getRemoteControllerRobotNos() {
List<RemoteControllerInformationDO> remoteControllerInformations = controllerInformationMapper.selectList(new LambdaQueryWrapper<RemoteControllerInformationDO>());
if (ObjectUtil.isEmpty(remoteControllerInformations)) {
return new ArrayList<>();
}
return remoteControllerInformations.stream().map(RemoteControllerInformationDO::getRobotNo).collect(Collectors.toList());
}
public RemoteControllerInformationDO checkRemoteControllerHaveBinding(String remoteIp) {
RemoteControllerInformationDO information = controllerInformationMapper.selectOne(new LambdaQueryWrapper<RemoteControllerInformationDO>()
.eq(RemoteControllerInformationDO::getRemoteIp, remoteIp)
.last("limit 1"));
if (ObjectUtil.isEmpty(information) || ObjectUtil.isEmpty(information.getRobotNo())) {
throw exception(REMOTE_NOT_HAVE_BINDING_ROBOT);
}
return information;
}
/**
* 远遥转移任务
*
@ -392,12 +462,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
*/
@Transactional(rollbackFor = Exception.class)
public void doRemoteTransferTaskToFreeRobot(RemoteTaskTransferDTO data) {
RemoteControllerInformationDO information = controllerInformationMapper.selectOne(new LambdaQueryWrapper<RemoteControllerInformationDO>()
.eq(RemoteControllerInformationDO::getRemoteIp, data.getRemoteIp())
.last("limit 1"));
if (ObjectUtil.isEmpty(information) || ObjectUtil.isEmpty(information.getRobotNo())) {
throw exception(REMOTE_NOT_HAVE_BINDING_ROBOT);
}
RemoteControllerInformationDO information = checkRemoteControllerHaveBinding(data.getRemoteIp());
//自动模式判断是否匹配路网
if (RemoteModeEnum.AUTOMATIC.getType().equals(data.getRemoteMode())) {
checkGraphMatch(information.getRobotNo());
@ -450,7 +515,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
informationService.rmoteTransferTaskToNewFreeRobo(oldRobotNo, data.getId(), information.getRobotNo());
//操作信息
createUserOperateAction(taskDetail,oldRobotNo);
createUserOperateAction(taskDetail, oldRobotNo);
}
/**
@ -468,7 +533,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
action = "取货库位任务 " + taskDetail.getFromLocationNo();
}
String msg = "远遥将 " + action + "从旧车辆 " + oldRobotNo + " 转移给新车辆 " + taskDetail.getRobotNo();
String msg = "远遥将 " + action + "从旧车辆 " + oldRobotNo + " 转移给新车辆 " + taskDetail.getRobotNo();
UserOperationLogSaveReqVO build = UserOperationLogSaveReqVO.builder()
.operateAction(msg)
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
@ -508,10 +573,23 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
//第一次设置为自动模式
if (ObjectUtil.isEmpty(information.getRobotNo()) && RemoteModeEnum.AUTOMATIC.getType().equals(remoteMode)) {
RemoteControllerInformationDO remoteControllerInformation = controllerInformationMapper.selectOne(new LambdaQueryWrapper<RemoteControllerInformationDO>()
.eq(RemoteControllerInformationDO::getRobotNo, robotNo)
.last("limit 1"));
if (ObjectUtil.isNotEmpty(remoteControllerInformation)) {
throw exception(REMOTE_ALREADY_CHOOSE_ROBOT);
}
List<RobotDoingTaskDTO> robotDoingTaskNo = taskDetailService.getRobotDoingTaskNo(robotNo);
if (ObjectUtil.isNotEmpty(robotDoingTaskNo) && robotDoingTaskNo.size() > 1) {
throw exception(REMOTE_ROBOT_HAVE_MORE_TASK);
}
String operateAction = information.getRemoteIp() + " 开启远遥为自动模式";
information.setTaskDetailId(null);
setRemoteChangeLog(information, robotNo, remoteMode, operateAction);
sendRemoteMsgToPP(robotNo,PathPlanningTopicConstant.START_REMOTE_CONTROLLER,RemoteOperationModeEnum.AUTO.getType());
sendRemoteMsgToPP(robotNo, PathPlanningTopicConstant.START_REMOTE_CONTROLLER, RemoteOperationModeEnum.AUTO.getType());
sendModeToRobot(robotNo, RemoteOperationModeEnum.AUTO.getType());
return;
}
@ -522,7 +600,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
.operateAction(information.getRemoteIp() + " 重新进入远遥 " + RemoteModeEnum.getMsg(remoteMode))
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
userOperationLogService.createUserOperationLog(operationLog);
sendRemoteMsgToPP(robotNo,PathPlanningTopicConstant.START_REMOTE_CONTROLLER,RemoteOperationModeEnum.getType(information.getRemoteMode()));
sendRemoteMsgToPP(robotNo, PathPlanningTopicConstant.START_REMOTE_CONTROLLER, RemoteOperationModeEnum.getType(information.getRemoteMode()));
sendModeToRobot(robotNo, RemoteOperationModeEnum.getType(remoteMode));
return;
}
@ -535,7 +613,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
}
String operateAction = information.getRemoteIp() + " 切换远遥模式为 " + RemoteModeEnum.getMsg(remoteMode);
setRemoteChangeLog(information, robotNo, remoteMode, operateAction);
sendRemoteMsgToPP(robotNo,PathPlanningTopicConstant.START_REMOTE_CONTROLLER,RemoteOperationModeEnum.MAN.getType());
sendRemoteMsgToPP(robotNo, PathPlanningTopicConstant.START_REMOTE_CONTROLLER, RemoteOperationModeEnum.MAN.getType());
sendModeToRobot(robotNo, RemoteOperationModeEnum.MAN.getType());
return;
}
@ -560,7 +638,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
String operateAction = information.getRemoteIp() + " 切换远遥模式为 " + RemoteModeEnum.getMsg(remoteMode);
setRemoteChangeLog(information, robotNo, remoteMode, operateAction);
sendRemoteMsgToPP(robotNo,PathPlanningTopicConstant.START_REMOTE_CONTROLLER,RemoteOperationModeEnum.MAN.getType());
sendRemoteMsgToPP(robotNo, PathPlanningTopicConstant.START_REMOTE_CONTROLLER, RemoteOperationModeEnum.MAN.getType());
sendModeToRobot(robotNo, RemoteOperationModeEnum.MAN.getType());
return;
}
@ -571,7 +649,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
String operateAction = information.getRemoteIp() + " 切换远遥模式为 " + RemoteModeEnum.getMsg(remoteMode);
setRemoteChangeLog(information, robotNo, remoteMode, operateAction);
sendRemoteMsgToPP(robotNo,PathPlanningTopicConstant.START_REMOTE_CONTROLLER,RemoteOperationModeEnum.AUTO.getType());
sendRemoteMsgToPP(robotNo, PathPlanningTopicConstant.START_REMOTE_CONTROLLER, RemoteOperationModeEnum.AUTO.getType());
sendModeToRobot(robotNo, RemoteOperationModeEnum.AUTO.getType());
return;
}
@ -593,7 +671,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
checkGraphMatch(robotNo);
String operateAction = information.getRemoteIp() + " 切换远遥模式为 " + RemoteModeEnum.getMsg(remoteMode);
setRemoteChangeLog(information, robotNo, remoteMode, operateAction);
sendRemoteMsgToPP(robotNo,PathPlanningTopicConstant.START_REMOTE_CONTROLLER,RemoteOperationModeEnum.AUTO.getType());
sendRemoteMsgToPP(robotNo, PathPlanningTopicConstant.START_REMOTE_CONTROLLER, RemoteOperationModeEnum.AUTO.getType());
sendModeToRobot(robotNo, RemoteOperationModeEnum.AUTO.getType());
}
@ -626,7 +704,7 @@ public class RemoteControllerInformationServiceImpl extends ServiceImpl<RemoteCo
}
String mac = informationService.getMacByRobotNo(robotNo);
commonApi.commonMethod(robotModeDTO, RobotTopicConstant.ROBOT_COMMAND_TOPIC + mac);
log.info("发送消息让车机 :{} 切换模式 :{}",robotNo, JSON.toJSONString(robotModeDTO));
log.info("发送消息让车机 :{} 切换模式 :{}", robotNo, JSON.toJSONString(robotModeDTO));
}
/**

View File

@ -221,4 +221,10 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
* @param robotNo
*/
void rmoteTransferTaskToNewFreeRobo(String oldRobotNo ,Long id, String robotNo);
/**
* 设置车辆空闲
* @param robotNo
*/
void setRobotFree(String robotNo);
}

View File

@ -1444,6 +1444,19 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
pathPlanningApi.synchronousLineObject(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST);
}
/**
* 设置车辆空闲
* @param robotNo
*/
@Override
public void setRobotFree(String robotNo) {
RobotInformationDO robotInformationDO = informationMapper.selectOne(new LambdaQueryWrapper<RobotInformationDO>()
.eq(RobotInformationDO::getRobotNo, robotNo)
.last("limit 1"));
robotInformationDO.setRobotStatus(RobotStatusEnum.STAND_BY.getType());
informationMapper.updateById(robotInformationDO);
}
private Boolean checkElectricity(CommonConfigVO chargeConfig, RobotInformationDO robot, RobotStatusDataPoseDTO dataPoseDTO) {
String chargeModelKey = RobotTaskChcheConstant.ROBOT_CHARGE_MODEL + robot.getRobotNo();
Object chargeModelCache = redisUtil.get(chargeModelKey);

View File

@ -77,7 +77,7 @@ public interface RobotTaskDetailService {
* @param id
* @return
*/
void manuallyCompleted(Long id);
void manuallyCompleted(Long id,String str);
/**
* 查询此库位处理中的任务
@ -110,7 +110,7 @@ public interface RobotTaskDetailService {
* 获取机器人正在做的任务
* @return
*/
List<RobotDoingTaskDTO> getRobotDoingTaskNo();
List<RobotDoingTaskDTO> getRobotDoingTaskNo(String robotNo);
/**
@ -119,4 +119,10 @@ public interface RobotTaskDetailService {
* @return
*/
PageResult<RemoteExceptionTaskDetailDTO> getExceptionTaskDetail(RemoteTaskQueryDTO remoteTaskQuery);
/**
* 远遥点击取货完成
* @param id
*/
void remoteTaskTakeDone(Long id);
}

View File

@ -3,10 +3,13 @@ package cn.iocoder.yudao.module.system.service.robot;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.mqtt.api.common.CommonApi;
import cn.iocoder.yudao.module.system.api.path.vo.RobotClosePathPlantingDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteExceptionTaskDetailDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteExceptionTaskListDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteTaskDTO;
import cn.iocoder.yudao.module.system.api.remote.dto.RemoteTaskQueryDTO;
import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant;
import cn.iocoder.yudao.module.system.controller.admin.log.vo.UserOperationLogSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.robot.detail.RobotDoingTaskDTO;
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO;
@ -17,13 +20,20 @@ import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotWarnMsgDO;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskMapper;
import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum;
import cn.iocoder.yudao.module.system.enums.path.PathIsReachEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotTaskTypeEnum;
import cn.iocoder.yudao.module.system.enums.robot.actionlog.ActionStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaskStageEnum;
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.path.PathPlanningService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.transaction.annotation.Transactional;
@ -33,14 +43,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import java.util.Collections;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.TASK_DETAIL_CHANGE_ROBOT;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.TASK_DETAIL_NOT_EXISTS;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
/**
@ -68,6 +77,15 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService {
@Resource
private RobotWarnMsgService warnMsgService;
@Resource
private CommonApi commonApi;
@Resource
private UserOperationLogService userOperationLogService;
@Resource
private PathPlanningService pathPlanningService;
@Override
public Long createTaskDetail(RobotTaskDetailSaveReqVO createReqVO) {
// 插入
@ -144,11 +162,13 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService {
}
@Override
public void manuallyCompleted(Long taskDetailId) {
@Transactional(rollbackFor = Exception.class)
public void manuallyCompleted(Long taskDetailId, String str) {
RobotTaskDetailDO robotTaskDetailDO = taskDetailMapper.selectById(taskDetailId);
Long taskStage = robotTaskDetailDO.getTaskStage();
robotTaskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.DONE.getType());
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.MANUALLY_COMPLETED.getType());
robotTaskDetailDO.setOccurError(ZeroOneEnum.ZERO.getType());
taskDetailMapper.updateById(robotTaskDetailDO);
List<RobotTaskDetailDO> taskDetailDOS = taskDetailMapper.selectList(new LambdaQueryWrapperX<RobotTaskDetailDO>()
@ -161,20 +181,36 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService {
robotTaskMapper.updateRobot(robotTask);
}
RobotTaskDetailActionLogDO log = taskDetailActionLogService.getLastTaskByRobotNo(robotTaskDetailDO.getRobotNo());
if (ObjectUtil.isEmpty(log) || !log.getTaskDetailId().equals(taskDetailId)) {
UserOperationLogSaveReqVO build = UserOperationLogSaveReqVO.builder()
.operateAction("任务id " + taskDetailId + str + robotTaskDetailDO.getRobotNo())
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
userOperationLogService.createUserOperationLog(build);
RobotTaskDetailActionLogDO actionLog = taskDetailActionLogService.getLastTaskByRobotNo(robotTaskDetailDO.getRobotNo());
if (ObjectUtil.isEmpty(actionLog) || !actionLog.getTaskDetailId().equals(taskDetailId)) {
return;
}
informationService.setRobotFree(robotTaskDetailDO.getRobotNo());
actionLog.setActionStatus(ActionStatusEnum.DONE.getType());
taskDetailActionLogService.updateTaskDetailActionLogs(Arrays.asList(actionLog));
taskDetailActionLogService.setPreviousTaskDoneByOrderId(taskDetailId);
if (RobotTaskStageEnum.DONE.getType().equals(taskStage)
|| RobotTaskStageEnum.CLOSE.getType().equals(taskStage)
|| RobotTaskStageEnum.MANUALLY_COMPLETED.getType().equals(taskStage)
|| RobotTaskStageEnum.EXCEPTION.getType().equals(taskStage) ) {
|| RobotTaskStageEnum.CLOSE.getType().equals(taskStage)
|| RobotTaskStageEnum.MANUALLY_COMPLETED.getType().equals(taskStage)) {
return;
}
String mac = informationService.getMacByRobotNo(robotTaskDetailDO.getRobotNo());
informationService.robotCloseTaskDetail(String.valueOf(taskDetailId),mac,"");
informationService.robotCloseTaskDetail(String.valueOf(taskDetailId), mac, actionLog.getCommandType());
RobotClosePathPlantingDTO closePathPlanting = RobotClosePathPlantingDTO.builder()
.robotNo(robotTaskDetailDO.getRobotNo())
.id(robotTaskDetailDO.getId().toString())
.build();
commonApi.commonMethod(closePathPlanting, PathPlanningTopicConstant.KILL_TASK);
}
@Override
@ -202,16 +238,18 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService {
/**
* 获取机器人正在做的任务
*
* @return
*/
@Override
public List<RobotDoingTaskDTO> getRobotDoingTaskNo() {
return taskDetailMapper.getRobotDoingTaskNo();
public List<RobotDoingTaskDTO> getRobotDoingTaskNo(String robotNo) {
return taskDetailMapper.getRobotDoingTaskNo(robotNo);
}
/**
* 远遥查询异常的车辆
*
* @param pageReqVO
* @return
*/
@ -233,7 +271,7 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService {
List<Long> detailIds = page.getRecords().stream().map(RemoteExceptionTaskDetailDTO::getId).collect(Collectors.toList());
List<RobotWarnMsgDO> warnMsgs =warnMsgService.getWarnMsgByDetailIds(detailIds);
List<RobotWarnMsgDO> warnMsgs = warnMsgService.getWarnMsgByDetailIds(detailIds);
Map<Long, String> warnMsgMap = null;
if (ObjectUtil.isNotEmpty(warnMsgs)) {
warnMsgMap = warnMsgs.stream().collect(Collectors.toMap(RobotWarnMsgDO::getTaskDetailId, RobotWarnMsgDO::getWarnMsg));
@ -252,5 +290,42 @@ public class RobotTaskDetailServiceImpl implements RobotTaskDetailService {
return dataPage;
}
/**
* 取货完成
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void remoteTaskTakeDone(Long taskDetailId) {
RobotTaskDetailDO robotTaskDetailDO = taskDetailMapper.selectById(taskDetailId);
String str = " 远遥点击取货完成 ";
if (RobotTaskTypeEnum.TAKE.getType().equals(robotTaskDetailDO.getTaskType())) {
manuallyCompleted(taskDetailId, str);
} else if (RobotTaskTypeEnum.TAKE_RELEASE.getType().equals(robotTaskDetailDO.getTaskType())) {
if (!RobotTaskStageEnum.UN_START.getType().equals(robotTaskDetailDO.getTaskStage())
&& !RobotTaskStageEnum.GO_TAKE.getType().equals(robotTaskDetailDO.getTaskStage())
&& !RobotTaskStageEnum.TAKEING.getType().equals(robotTaskDetailDO.getTaskStage())) {
log.info("远遥点击取货完成时, 任务已经取完货 :{}", JSON.toJSONString(robotTaskDetailDO));
throw exception(TASK_NOT_TAKE_RELEASE);
}
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType());
taskDetailMapper.updateById(robotTaskDetailDO);
UserOperationLogSaveReqVO build = UserOperationLogSaveReqVO.builder()
.operateAction("任务id " + taskDetailId + str + robotTaskDetailDO.getRobotNo())
.nickName(SecurityFrameworkUtils.getLoginUserNickname()).build();
userOperationLogService.createUserOperationLog(build);
taskDetailActionLogService.setPreviousTaskDoneByOrderId(taskDetailId);
pathPlanningService.updateBehavior(String.valueOf(taskDetailId), robotTaskDetailDO.getRobotNo()
, "", PathIsReachEnum.END_WORK.getType());
} else {
throw exception(TASK_NOT_TAKE_RELEASE);
}
}
}

View File

@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO;
import cn.iocoder.yudao.module.system.dal.mysql.config.CommonConfigMapper;
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.RobotTaskDetailMapper;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskMapper;
@ -20,7 +21,6 @@ import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum;
import cn.iocoder.yudao.module.system.enums.config.CommandConfigTypeEnum;
import cn.iocoder.yudao.module.system.enums.robot.*;
import cn.iocoder.yudao.module.system.enums.robot.charge.ChargeModelEnum;
import cn.iocoder.yudao.module.system.enums.robot.information.ChargeTypeEnum;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -63,6 +63,9 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
@Resource
private RedisUtil redisUtil;
@Resource
private RemoteControllerInformationMapper controllerInformationMapper;
/**
* 获取待执行的机器人和任务
@ -82,6 +85,9 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
return pair;
}
List<String> remoteRobotNos = controllerInformationMapper.getRemoteControllerRobotNos();
log.info("远遥中的车辆 :{}",JSON.toJSONString(remoteRobotNos));
List<RobotInformationDO> robots = robotInformationMapper.selectList(new LambdaQueryWrapperX<RobotInformationDO>()
.in(RobotInformationDO::getRobotStatus, RobotStatusEnum.STAND_BY.getType(), RobotStatusEnum.CHARGE.getType())
.eq(RobotInformationDO::getRobotTaskModel, RobotTaskModelEnum.NORMAL.getType()));
@ -101,6 +107,11 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
CommonConfigVO chargeConfig = JSONUtil.toBean(commonConfigDO.getConfigStr(), CommonConfigVO.class);
for (RobotInformationDO robot : robots) {
if (ObjectUtil.isNotEmpty(remoteRobotNos) && remoteRobotNos.contains(robot.getRobotNo())) {
continue;
}
String taskStatusKey = RobotTaskChcheConstant.ROBOT_TASK_STATUS + robot.getMacAddress();
String cargoDetectedKey = RobotTaskChcheConstant.ROBOT_CARGO_DETECTED + robot.getMacAddress();
Object taskStatus = redisUtil.get(taskStatusKey);

View File

@ -9,4 +9,13 @@
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<select id="getRemoteControllerRobotNos" resultType="java.lang.String">
select
robot_no
from
remote_controller_information
where
deleted = '0'
and robot_no != ''
</select>
</mapper>

View File

@ -311,6 +311,10 @@
select
distinct
t2.robot_no as robotNo,
t2.id as id,
t2.task_stage as taskStage,
t2.task_status as taskStatus,
t2.task_type as taskType,
t1.task_no as taskNo
from
robot_task t1 left join robot_task_detail t2
@ -320,6 +324,9 @@
and t2.deleted = '0'
and t1.task_status = '1'
and t2.task_status ='1'
<if test="robotNo != null and robotNo != ''">
and t2.robot_no = #{robotNo}
</if>
</select>