任务状态

This commit is contained in:
cbs 2025-03-12 15:53:50 +08:00
parent 908ac015ca
commit df8c8b28c6
45 changed files with 868 additions and 230 deletions

View File

@ -0,0 +1,17 @@
package cn.iocoder.yudao.module.mqtt.api.path.task;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaskPathPlanningDTO {
private String orderId;
private String robotNo;
private String behaviorId;
private String isReach;
}

View File

@ -19,10 +19,10 @@ import java.util.List;
public class TaskToPathPlanningDTO {
@Schema(description = "robot_task_detail/robot_charge_log 的 id")
private String id;
private String orderId;
@Schema(description = "任务类型(TASK:robot_task的任务、CHARGE:充电任务)")
private String type;
private String orderType;
//线库: LINE + 线库号
//普通库位: POINT + 点位号

View File

@ -3,15 +3,19 @@ package cn.iocoder.yudao.module.mqtt.api.task.dto;
import lombok.Builder;
import lombok.Data;
import java.util.List;
@Data
@Builder
public class RobotAssignTaskArgDTO {
//检测托盘时需要抬叉的高度现在是需要以后不用了
private Double check_pallet_height;
// private Double check_pallet_height;
//取货高度
private Double height;
//整型 取第几层货
private Double level;
//叉起货需要在原来高度基础上偏移的高度
private Double offset_height;
private Double offsetHeight;
private List<Pose2ds> pose2ds;
}

View File

@ -12,7 +12,8 @@ import java.util.List;
@Builder
public class RobotAssignTaskDTO {
private String topic;
private String order_id;
private String order_type;
private String orderId;
private String orderType;
private String executionType;
private List<RobotAssignTaskDataDTO> data;
}

View File

@ -6,6 +6,6 @@ import java.util.List;
@Data
public class RobotAssignTaskDataDTO {
private String command_type;
private String commandType;
private List<RobotAssignTaskArgDTO> arg;
}

View File

@ -1,11 +1,14 @@
/*
package cn.iocoder.yudao.module.mqtt.enums.path;
import lombok.AllArgsConstructor;
import lombok.Getter;
*/
/**
*TaskToPathPlanningDTO的type
*/
*//*
@Getter
@AllArgsConstructor
public enum TaskTypeEnum {
@ -15,3 +18,4 @@ public enum TaskTypeEnum {
private final String type;
}
*/

View File

@ -18,5 +18,5 @@ public interface RobotTaskStatusApi {
@PostMapping(PREFIX + "/updateStatus")
@Operation(summary = "机器人完成任务上报")
CommonResult<Boolean> robotDoneTask(@RequestBody RobotCompleteTaskDTO robotCompleteTaskDTO);
void robotDoneTask(@RequestBody RobotCompleteTaskDTO robotCompleteTaskDTO);
}

View File

@ -7,19 +7,19 @@ public class RobotCommandStateDTO {
/**
* 命令id
*/
private String command_id;
// private String command_id;
/**
* 命令类型
*/
private String command_type;
private String commandType;
/**
* 执行状态
*/
private String execution_state;
private Integer executionState;
/**
* 响应的状态码
*/
private String status_code;
private String statusCode;
/**
* 失败时的错误原因
*/

View File

@ -13,19 +13,19 @@ public class RobotCompleteTaskDTO {
/**
* robot_task_detail 表id
*/
private Long order_id;
private Long orderId;
/**
* 任务类型暂时未定义
*/
private String order_type;
private String orderType;
/**
* 执行状态
*/
private Integer execution_state;
private Integer executionState;
/**
* 响应的状态码
*/
private String status_code;
private String statusCode;
/**
* 失败时的错误原因
*/
@ -37,5 +37,5 @@ public class RobotCompleteTaskDTO {
/**
* 子任务
*/
private List<RobotCommandStateDTO> command_state;
private RobotCommandStateDTO commandStatus;
}

View File

@ -241,5 +241,7 @@ public interface ErrorCodeConstants {
ErrorCode TASK_CYCLE_NOT_EXISTS = new ErrorCode(1_002_046_001, "循环任务点位不存在");
// ========== 用户操作记录 1_002_047_001 ==========
ErrorCode OPERATE_LOG_NOT_EXISTS = new ErrorCode(1_002_047_001, "用户操作记录不存在");
// ========== 车辆前往等待点记录 1_002_048_001 ==========
ErrorCode MOVE_TO_WAIT_NOT_EXISTS = new ErrorCode(1_002_048_001, "车辆前往等待点记录不存在");
}

View File

@ -21,10 +21,8 @@ import cn.iocoder.yudao.module.system.constant.webSocket.WebSocketConstant;
import cn.iocoder.yudao.module.system.dal.dataobject.actionlog.RobotTaskDetailActionLogDO;
import cn.iocoder.yudao.module.system.dal.dataobject.config.CommonConfigDO;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotChargeLogDO;
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.dataobject.robot.RobotWarnMsgDO;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.*;
import cn.iocoder.yudao.module.system.dal.mysql.actionlog.RobotTaskDetailActionLogMapper;
import cn.iocoder.yudao.module.system.dal.mysql.cycle.TaskCycleMapper;
import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationMapper;
@ -32,13 +30,18 @@ import cn.iocoder.yudao.module.system.dal.mysql.information.DeviceInformationMap
import cn.iocoder.yudao.module.system.dal.mysql.robot.*;
import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum;
import cn.iocoder.yudao.module.system.enums.device.DeviceUseStatusEnum;
import cn.iocoder.yudao.module.system.enums.path.PathIsReachEnum;
import cn.iocoder.yudao.module.system.enums.path.PathTaskType;
import cn.iocoder.yudao.module.system.enums.robot.*;
import cn.iocoder.yudao.module.system.enums.robot.charge.ChargeTaskStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotStatusCodeEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaksOrderTypeEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaskStageEnum;
import cn.iocoder.yudao.module.system.enums.wait.WaitStatusEnum;
import cn.iocoder.yudao.module.system.service.path.PathPlanningService;
import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
import cn.iocoder.yudao.module.system.service.robot.RobotTaskDetailService;
import cn.iocoder.yudao.module.system.service.robot.RobotWarnMsgService;
import cn.iocoder.yudao.module.system.service.wait.MoveToWaitService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -112,7 +115,13 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
@Resource
private DeviceInformationMapper deviceInformationMapper;
@Value("${zn.robot_doing_action.doing_action_cache_time:3*60*60}")
@Resource
private MoveToWaitService moveToWaitService;
@Resource
private PathPlanningService pathPlanningService;
@Value("${zn.robot_doing_action.doing_action_cache_time:2*24*60*60}")
private Long doingActionCacheTime;
@Transactional(rollbackFor = Exception.class)
@ -121,33 +130,103 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
TenantContextHolder.setTenantId(1L);
String robotDoingActionKey = RobotTaskChcheConstant.ROBOT_QUERY_DOING_ACTION + robotCompleteTaskDTO.getMac();
if (!RobotStatusCodeEnum.SUCCESS.getType().equals(robotCompleteTaskDTO.getStatus_code())) {
if (!RobotStatusCodeEnum.SUCCESS.getType().equals(robotCompleteTaskDTO.getStatusCode())) {
log.info("车机上报异常 :{}", JSON.toJSONString(robotCompleteTaskDTO));
closeTask(robotCompleteTaskDTO);
closeTask(robotCompleteTaskDTO);//todo 取不了和放不了的异常
redisUtil.del(robotDoingActionKey);
return;
}
if (RobotExecutionStateConstant.UN_DO.equals(robotCompleteTaskDTO.getExecution_state())) {
if (RobotExecutionStateConstant.UN_DO.equals(robotCompleteTaskDTO.getExecutionState())
|| RobotExecutionStateConstant.STOP.equals(robotCompleteTaskDTO.getExecutionState())
|| RobotExecutionStateConstant.CLOSE.equals(robotCompleteTaskDTO.getExecutionState())) {
log.info("任务未开始/暂停/取消 :{}", robotCompleteTaskDTO.getOrderId());
return;
} else if (RobotExecutionStateConstant.DONE.equals(robotCompleteTaskDTO.getExecutionState())) {
robotTaskDone(robotCompleteTaskDTO);
redisUtil.del(robotDoingActionKey);
} else if (RobotExecutionStateConstant.DOING.equals(robotCompleteTaskDTO.getExecutionState())) {
robotTaskDoing(robotCompleteTaskDTO, robotDoingActionKey);
}
}
if (RobotExecutionStateConstant.DOING.equals(robotCompleteTaskDTO.getExecution_state())
&& RobotTaksOrderTypeEnum.TASK.getType().equals(robotCompleteTaskDTO.getOrder_type())) {
taskDoing(robotCompleteTaskDTO, robotDoingActionKey);
} else if (RobotExecutionStateConstant.DONE.equals(robotCompleteTaskDTO.getExecution_state())
&& RobotTaksOrderTypeEnum.TASK.getType().equals(robotCompleteTaskDTO.getOrder_type())) {
taskDone(robotCompleteTaskDTO);
redisUtil.del(robotDoingActionKey);
} else if (RobotExecutionStateConstant.DOING.equals(robotCompleteTaskDTO.getExecution_state())
&& RobotTaksOrderTypeEnum.AUTO_CHARGE.getType().equals(robotCompleteTaskDTO.getOrder_type())) {
/**
* @param robotCompleteTaskDTO
*/
private void robotTaskDoing(RobotCompleteTaskDTO robotCompleteTaskDTO, String robotDoingActionKey) {
if (PathTaskType.AUTO_CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
chargeDoing(robotCompleteTaskDTO, robotDoingActionKey);
} else if (RobotExecutionStateConstant.DONE.equals(robotCompleteTaskDTO.getExecution_state())
&& RobotTaksOrderTypeEnum.AUTO_CHARGE.getType().equals(robotCompleteTaskDTO.getOrder_type())) {
chargeDone(robotCompleteTaskDTO, robotDoingActionKey);
} else if (PathTaskType.MOVE_TO_WAIT.getType().equals(robotCompleteTaskDTO.getOrderType())) {
RobotTaskDetailActionLogDO logOne = new RobotTaskDetailActionLogDO();
logOne.setActionMsg("车辆正在前往等待点");
String robotNo = robotInformationService.getRobotNoByMac(robotCompleteTaskDTO.getMac());
logOne.setRobotNo(robotNo);
logOne.setTaskDetailId(robotCompleteTaskDTO.getOrderId());
taskDetailActionLogMapper.insert(logOne);
redisUtil.set(robotDoingActionKey, logOne.getActionMsg(), doingActionCacheTime);
moveToWaitService.setMoveToWaitDoing(robotCompleteTaskDTO.getOrderId(), WaitStatusEnum.GO_TO_WAIT.getType());
} else {
taskDoing(robotCompleteTaskDTO, robotDoingActionKey);
}
sendStartDoActionToPP(robotCompleteTaskDTO.getCommandStatus(), robotCompleteTaskDTO.getMac(),
String.valueOf(robotCompleteTaskDTO.getOrderId()));
}
/**
* 告诉PP开始作业
*
* @param commandStatus
* @param mac
* @param orderId
*/
public void sendStartDoActionToPP(RobotCommandStateDTO commandStatus, String mac, String orderId) {
if (ObjectUtil.isNotEmpty(commandStatus) && RobotExecutionStateConstant.DOING.equals(commandStatus.getExecutionState())
&& !CommandTypeEnum.MOVE_POSES.getType().equals(commandStatus.getCommandType())) {
String robotNo = robotInformationService.getRobotNoByMac(mac);
pathPlanningService.updateBehavior(orderId, robotNo
, "", PathIsReachEnum.START_WORK.getType());
}
}
/**
* 机器人完成任务
*
* @param robotCompleteTaskDTO
*/
private void robotTaskDone(RobotCompleteTaskDTO robotCompleteTaskDTO) {
//todo 后面考虑下充电车机目前对充电的逻辑未定义
if (PathTaskType.MOVE.getType().equals(robotCompleteTaskDTO.getOrderType())
|| PathTaskType.MOVE_TO_WAIT_STOP.getType().equals(robotCompleteTaskDTO.getOrderType())
|| PathTaskType.TAKE.getType().equals(robotCompleteTaskDTO.getOrderType())
|| PathTaskType.RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
taskDone(robotCompleteTaskDTO);
} else if (PathTaskType.TAKE_RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId());
if (RobotTaskStageEnum.TAKEING.getType().equals(robotTaskDetailDO.getTaskStage())) {
pathPlanningService.updateBehavior(String.valueOf(robotCompleteTaskDTO.getOrderId()), robotTaskDetailDO.getRobotNo()
, "", PathIsReachEnum.END_WORK.getType());
} else if (RobotTaskStageEnum.RELEASEING.getType().equals(robotTaskDetailDO.getTaskStage())) {
taskDone(robotCompleteTaskDTO);
}
}
}
/**
* 通知PP关闭任务
*
* @param robotCompleteTaskDTO
*/
public void PPCloseOrder(RobotCompleteTaskDTO robotCompleteTaskDTO) {
String robotNo = robotInformationService.getRobotNoByMac(robotCompleteTaskDTO.getMac());
RobotClosePathPlantingDTO closePathPlanting = RobotClosePathPlantingDTO.builder()
.robotNo(robotNo)
.id(robotCompleteTaskDTO.getOrderId().toString())
.build();
commonApi.commonMethod(closePathPlanting, PathPlanningTopicConstant.KILL_TASK);
log.info("车机上报异常, 通知PP把任务取消 :{}", robotCompleteTaskDTO.getOrderId());
}
/**
@ -157,16 +236,10 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
*/
@Transactional(rollbackFor = Exception.class)
public void closeTask(RobotCompleteTaskDTO robotCompleteTaskDTO) {
String robotNo = robotInformationService.getRobotNoByMac(robotCompleteTaskDTO.getMac());
RobotClosePathPlantingDTO closePathPlanting = RobotClosePathPlantingDTO.builder()
.robotNo(robotNo)
.id(robotCompleteTaskDTO.getOrder_id().toString())
.build();
commonApi.commonMethod(closePathPlanting, PathPlanningTopicConstant.KILL_TASK);
log.info("车机上报异常, 通知PP把任务取消 :{}", robotCompleteTaskDTO.getOrder_id());
PPCloseOrder(robotCompleteTaskDTO);
if (RobotTaksOrderTypeEnum.TASK.getType().equals(robotCompleteTaskDTO.getOrder_type())) {
RobotTaskDetailDO robotTaskDetailDO = closeTaskDetail(robotCompleteTaskDTO.getOrder_id());
/*if (RobotTaksOrderTypeEnum.TASK.getType().equals(robotCompleteTaskDTO.getOrderType())) {
RobotTaskDetailDO robotTaskDetailDO = closeTaskDetail(robotCompleteTaskDTO.getOrderId());
List<Long> locationIds = new ArrayList<>();
if (ObjectUtil.isNotEmpty(robotTaskDetailDO.getFromLocationId())) {
locationIds.add(robotTaskDetailDO.getFromLocationId());
@ -179,22 +252,22 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
, LocationLockEnum.YES.getType());
}
} else if (RobotTaksOrderTypeEnum.AUTO_CHARGE.getType().equals(robotCompleteTaskDTO.getOrder_type())) {
} else if (RobotTaksOrderTypeEnum.AUTO_CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
RobotChargeLogDO robotChargeLogDO = chargeLogMapper.selectOne(new LambdaQueryWrapper<RobotChargeLogDO>()
.eq(RobotChargeLogDO::getId, robotCompleteTaskDTO.getOrder_id()));
.eq(RobotChargeLogDO::getId, robotCompleteTaskDTO.getOrderId()));
robotChargeLogDO.setTaskStatus(ChargeTaskStatusEnum.ABNORMAL.getType());
chargeLogMapper.updateById(robotChargeLogDO);
if (ObjectUtil.isNotEmpty(robotChargeLogDO.getTaskDetailId())) {
closeTaskDetail(robotCompleteTaskDTO.getOrder_id());
closeTaskDetail(robotCompleteTaskDTO.getOrderId());
}
deviceInformationMapper.updateDeviceUseStatus(robotChargeLogDO.getDeviceNo(),
DeviceUseStatusEnum.IDLE.getType(), ZeroOneEnum.ZERO.getType());
}
}*/
RobotWarnMsgDO warnMsg = RobotWarnMsgDO.builder().warnLevel(4)
.warnCode(robotCompleteTaskDTO.getStatus_code())
/* RobotWarnMsgDO warnMsg = RobotWarnMsgDO.builder().warnLevel(4)
.warnCode(robotCompleteTaskDTO.getStatusCode())
.robotNo(robotNo)
.warnType(RobotWarnType.ROBOT_WARN.getType())
.warnMsg(robotNo +"_"+robotCompleteTaskDTO.getMessage())
@ -202,11 +275,12 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
.build();
warnMsgMapper.insert(warnMsg);
warnMsgService.sendWarnMsgToWebsocket(warnMsg.getWarnMsg());
warnMsgService.sendWarnMsgToWebsocket(warnMsg.getWarnMsg());*/
}
/**
* 关闭订单
*
* @param taskDetailId
*/
public RobotTaskDetailDO closeTaskDetail(Long taskDetailId) {
@ -224,7 +298,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
logOne.setActionMsg("车辆正在充电");
String robotNo = robotInformationService.getRobotNoByMac(robotCompleteTaskDTO.getMac());
logOne.setRobotNo(robotNo);
logOne.setTaskDetailId(robotCompleteTaskDTO.getOrder_id());
logOne.setTaskDetailId(robotCompleteTaskDTO.getOrderId());
taskDetailActionLogMapper.insert(logOne);
redisUtil.set(robotDoingActionKey, logOne.getActionMsg(), doingActionCacheTime);
}
@ -236,11 +310,20 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
* @param robotCompleteTaskDTO
*/
private void chargeDoing(RobotCompleteTaskDTO robotCompleteTaskDTO, String robotDoingActionKey) {
List<RobotCommandStateDTO> commandState = robotCompleteTaskDTO.getCommand_state();
if (ObjectUtil.isEmpty(commandState)) {
return;
RobotTaskDetailActionLogDO logOne = new RobotTaskDetailActionLogDO();
RobotCommandStateDTO commandStatus = robotCompleteTaskDTO.getCommandStatus();
if (ObjectUtil.isNotEmpty(commandStatus) && CommandTypeEnum.MOVE_POSES.getType().equals(commandStatus.getCommandType())) {
RobotChargeLogDO robotChargeLogDO = chargeLogMapper.selectById(robotCompleteTaskDTO.getOrderId());
logOne.setActionMsg("车辆正在前往充电点" + robotChargeLogDO.getDeviceNo());
} else if (ObjectUtil.isNotEmpty(commandStatus)) {
logOne.setActionMsg("车辆正在充电");
}
addActionLog(commandState, robotDoingActionKey);
String robotNo = robotInformationService.getRobotNoByMac(robotCompleteTaskDTO.getMac());
logOne.setRobotNo(robotNo);
logOne.setTaskDetailId(robotCompleteTaskDTO.getOrderId());
taskDetailActionLogMapper.insert(logOne);
redisUtil.set(robotDoingActionKey, logOne.getActionMsg(), doingActionCacheTime);
}
/**
@ -251,12 +334,12 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
private void taskDone(RobotCompleteTaskDTO robotCompleteTaskDTO) {
//更新任务状态
RobotTaskDetailDO detailDO = new RobotTaskDetailDO();
detailDO.setId(robotCompleteTaskDTO.getOrder_id());
detailDO.setId(robotCompleteTaskDTO.getOrderId());
detailDO.setEndTime(LocalDateTime.now());
detailDO.setTaskStatus(robotCompleteTaskDTO.getExecution_state());
detailDO.setTaskStatus(RobotTaskDetailStatusEnum.DONE.getType());
robotTaskDetailMapper.updateRobotDetailById(detailDO);
//更新任务状态
RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrder_id());
RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId());
List<RobotTaskDetailDO> taskDetails = robotTaskDetailMapper.queryByTaskId(robotTaskDetailDO.getRobotTaskId());
boolean done =
taskDetails.stream().noneMatch(v -> (v.getTaskStatus().equals(RobotTaskDetailStatusEnum.NEW.getType())));
@ -269,31 +352,20 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
taskCycleMapper.deletByRobotTaskId(taskDetails.get(0).getRobotTaskId());
}
if (RobotTaskTypeEnum.MOVE.getType().equals(robotTaskDetailDO.getTaskType())) {
robotInformationMapper.updateRobotTaskModel(robotTaskDetailDO.getRobotNo(), RobotTaskModelEnum.REJECTION.getType());
RobotInformationDO robotInformationDO = robotInformationMapper.selectOne(new LambdaQueryWrapperX<RobotInformationDO>()
.eq(RobotInformationDO::getRobotNo, robotTaskDetailDO.getRobotNo()));
robotInformationDO.setRobotStatus(RobotStatusEnum.STAND_BY.getType());
if (RobotTaskTypeEnum.MOVE.getType().equals(robotTaskDetailDO.getTaskType())
|| (RobotTaskTypeEnum.PARK.getType().equals(robotTaskDetailDO.getTaskType())
&& ZeroOneEnum.ONE.getType().equals(robotTaskDetailDO.getNeedLock()))) {
robotInformationDO.setRobotTaskModel(RobotTaskModelEnum.REJECTION.getType());
}
robotInformationMapper.updateBatch(robotInformationDO);
//同步任务完成给PP
pathPlanningService.updateBehavior(String.valueOf(robotCompleteTaskDTO.getOrderId()), robotTaskDetailDO.getRobotNo()
, "", PathIsReachEnum.END_WORK.getType());
}
/**
* 添加操作日志
*
* @param commandState
*/
public void addActionLog(List<RobotCommandStateDTO> commandState, String robotDoingActionKey) {
RobotCommandStateDTO robotCommandStateDTO = commandState.stream()
.filter(v -> RobotExecutionStateConstant.DOING.equals(Integer.valueOf(v.getExecution_state())))
.findFirst()
.orElse(null);
if (ObjectUtil.isNotEmpty(robotCommandStateDTO)) {
String robotDoingActionLogKey = RobotTaskChcheConstant.ROBOT_ACTION_LOG_ENTITY + robotCommandStateDTO.getCommand_id();
Object o = redisUtil.get(robotDoingActionLogKey);
if (ObjectUtil.isNotEmpty(o)) {
RobotTaskDetailActionLogDO actionLog = JSON.parseObject(JSON.toJSONString(o), RobotTaskDetailActionLogDO.class);
taskDetailActionLogMapper.insert(actionLog);
redisUtil.set(robotDoingActionKey, actionLog.getActionMsg(), doingActionCacheTime);
}
}
}
/**
* 任务处理中
@ -302,51 +374,74 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
*/
@Transactional(rollbackFor = Exception.class)
public void taskDoing(RobotCompleteTaskDTO robotCompleteTaskDTO, String robotDoingActionKey) {
List<RobotCommandStateDTO> commandState = robotCompleteTaskDTO.getCommand_state();
if (ObjectUtil.isEmpty(commandState)) {
return;
}
addActionLog(commandState, robotDoingActionKey);
String robotActionTakeGoodsKey = RobotTaskChcheConstant.ROBOT_ACTION_TAKE_GOODS + robotCompleteTaskDTO.getOrder_id();
Object o1 = redisUtil.get(robotActionTakeGoodsKey);
RobotTaskDetailDO robotTaskDetailDO = robotTaskDetailMapper.selectById(robotCompleteTaskDTO.getOrderId());
Long taskStage = robotTaskDetailDO.getTaskStage();
String robotActionReleaseGoodsKey = RobotTaskChcheConstant.ROBOT_ACTION_RELEASE_GOODS + robotCompleteTaskDTO.getOrder_id();
Object o2 = redisUtil.get(robotActionReleaseGoodsKey);
RobotCommandStateDTO commandStatus = robotCompleteTaskDTO.getCommandStatus();
String commandType = commandStatus.getCommandType();
if (ObjectUtil.isEmpty(o1) && ObjectUtil.isEmpty(o2)) {
return;
RobotTaskDetailActionLogDO logOne = new RobotTaskDetailActionLogDO();
if (PathTaskType.TAKE_RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType) && RobotTaskStageEnum.UN_START.getType().equals(taskStage)) {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getFromLocationNo() + "取货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_TAKE.getType());
} else if (CommandTypeEnum.WORK_PICK_UP_GOODS.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在取货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING.getType());
} else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在放货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType());
} else if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getToLocationNo() + "放货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType());
}
String takeCommonId = ObjectUtil.isNotEmpty(o1) ? String.valueOf(o1) : null;
String releaseCommonId = ObjectUtil.isNotEmpty(o2) ? String.valueOf(o2) : null;
} else if (PathTaskType.CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
RobotChargeLogDO robotChargeLogDO = chargeLogMapper.selectById(robotCompleteTaskDTO.getOrderId());
if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在前往" + robotChargeLogDO.getDeviceNo() + "充电");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.MOVE.getType());
} else {
logOne.setActionMsg("车辆正在充电");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.CHARGEING.getType());
}
for (RobotCommandStateDTO commandStateDTO : commandState) {
//释放取的库位
if (RobotExecutionStateConstant.DONE.equals(Integer.valueOf(commandStateDTO.getExecution_state()))
&& ObjectUtil.isNotEmpty(takeCommonId) && takeCommonId.equals(commandStateDTO.getCommand_id())) {
RobotTaskDetailActionLogDO actionLogDO =
taskDetailActionLogMapper.selectOne(new LambdaQueryWrapperX<RobotTaskDetailActionLogDO>()
.eq(RobotTaskDetailActionLogDO::getCommandId, commandStateDTO.getCommand_id()));
if (ObjectUtil.isNotEmpty(actionLogDO) && ObjectUtil.isNotEmpty(actionLogDO.getTaskDetailId())) {
freeLocation(true, actionLogDO.getTaskDetailId());
redisUtil.del(robotActionTakeGoodsKey);
}
}
//释放放的库位
if (RobotExecutionStateConstant.DONE.equals(Integer.valueOf(commandStateDTO.getExecution_state()))
&& ObjectUtil.isNotEmpty(releaseCommonId) && releaseCommonId.equals(commandStateDTO.getCommand_id())) {
RobotTaskDetailActionLogDO actionLogDO =
taskDetailActionLogMapper.selectOne(new LambdaQueryWrapperX<RobotTaskDetailActionLogDO>()
.eq(RobotTaskDetailActionLogDO::getCommandId, commandStateDTO.getCommand_id()));
if (ObjectUtil.isNotEmpty(actionLogDO) && ObjectUtil.isNotEmpty(actionLogDO.getTaskDetailId())) {
freeLocation(false, actionLogDO.getTaskDetailId());
redisUtil.del(robotActionReleaseGoodsKey);
}
} else if (PathTaskType.MOVE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getToLocationNo());
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.MOVE.getType());
}
} else if (PathTaskType.MOVE_TO_WAIT_STOP.getType().equals(robotCompleteTaskDTO.getOrderType())) {
if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getToLocationNo());
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.MOVE.getType());
}
} else if (PathTaskType.TAKE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType) && RobotTaskStageEnum.UN_START.getType().equals(taskStage)) {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getFromLocationNo() + "取货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_TAKE.getType());
} else if (CommandTypeEnum.WORK_PICK_UP_GOODS.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在取货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.TAKEING.getType());
}
} else if (PathTaskType.RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) {
if (CommandTypeEnum.MOVE_POSES.getType().equals(commandType) && RobotTaskStageEnum.UN_START.getType().equals(taskStage)) {
logOne.setActionMsg("车辆正在前往" + robotTaskDetailDO.getToLocationNo() + "放货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.GO_RELEASE.getType());
} else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(commandType)) {
logOne.setActionMsg("车辆正在放货");
robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.RELEASEING.getType());
}
}
String robotNo = robotInformationService.getRobotNoByMac(robotCompleteTaskDTO.getMac());
logOne.setRobotNo(robotNo);
logOne.setTaskDetailId(robotCompleteTaskDTO.getOrderId());
taskDetailActionLogMapper.insert(logOne);
redisUtil.set(robotDoingActionKey, logOne.getActionMsg(), doingActionCacheTime);
robotTaskDetailMapper.updateBatch(robotTaskDetailDO);
}
public void freeLocation(Boolean isTake, Long taskDetailId) {
@ -385,11 +480,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi {
*/
@Override
@Transactional(rollbackFor = Exception.class)
public CommonResult<Boolean> robotDoneTask(RobotCompleteTaskDTO robotCompleteTaskDTO) {
public void robotDoneTask(RobotCompleteTaskDTO robotCompleteTaskDTO) {
taskExecutor.execute(() -> {
doRobotDoneTask(robotCompleteTaskDTO);
});
return CommonResult.success(true);
}
}

View File

@ -83,7 +83,7 @@ public class PathPlanningTopicConstant {
/**
* 实时行为上报
*/
public static String UPDATE_ACTION = "UPDATE_ACTION";
public static String UPDATE_BEHAVIOR = "UPDATE_BEHAVIOR";
}

View File

@ -36,8 +36,8 @@ public class RobotTaskChcheConstant {
public static String ROBOT_ACTION_LOG_ENTITY = "robot:action:log:entity";
//机器人取货完成(拼接robot_task_detail的id)
public static String ROBOT_ACTION_TAKE_GOODS = "robot:take:";
// public static String ROBOT_ACTION_TAKE_GOODS = "robot:take:";
//机器人放货完成(拼接robot_task_detail的id)
public static String ROBOT_ACTION_RELEASE_GOODS = "robot:release:";
// public static String ROBOT_ACTION_RELEASE_GOODS = "robot:release:";
}

View File

@ -5,8 +5,8 @@ import lombok.Data;
@Data
public class TaskOrderConfigDTO {
private String task_assignment_strategy;
private String priority_factor;
private String time_factor;
private String time_difference_threshold_second;
private String taskAssignmentStrategy;
private String priorityFactor;
private String timeFactor;
private String timeDifferenceThresholdSecond;
}

View File

@ -52,4 +52,7 @@ public class PositionMapItemPageReqVO extends PageParam {
@Schema(description = "排序的位置,越大越优先堆放")
private Long locationNumber;
@Schema(description = "等待点使用状态(0.空闲 1.使用中)")
private Integer useStatus;
}

View File

@ -70,4 +70,8 @@ public class PositionMapItemRespVO {
@ExcelProperty("排序的位置,越大越优先堆放")
private Long locationNumber;
@Schema(description = "等待点使用状态(0.空闲 1.使用中)")
@ExcelProperty("等待点使用状态(0.空闲 1.使用中)")
private Integer useStatus;
}

View File

@ -42,4 +42,7 @@ public class PositionMapItemSaveReqVO {
@Schema(description = "排序的位置,越大越优先堆放")
private Long locationNumber;
@Schema(description = "等待点使用状态(0.空闲 1.使用中)")
private Integer useStatus;
}

View File

@ -56,7 +56,7 @@ public class RobotTaskDetailPageReqVO extends PageParam {
@Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)", example = "1")
private Integer taskStatus;
@Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3运输中、4放货中、5结束)")
@Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3前往放货、4放货中、5结束、6移动中、7:正在充电)")
private Long taskStage;
@Schema(description = "开始时间")

View File

@ -62,8 +62,8 @@ public class RobotTaskDetailRespVO {
@ExcelProperty("任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)")
private Integer taskStatus;
@Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3运输中、4放货中、5结束)")
@ExcelProperty("任务阶段(0:待执行、1前往取货、2取货中、3运输中、4放货中、5结束)")
@Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3前往放货、4放货中、5结束、6移动中、7:正在充电)")
@ExcelProperty("任务阶段(0:待执行、1前往取货、2取货中、3前往放货、4放货中、5结束、6移动中、7:正在充电)")
private Long taskStage;
@Schema(description = "开始时间")

View File

@ -62,7 +62,7 @@ public class RobotTaskDetailSaveReqVO {
@Schema(description = "任务状态(0:未开始、1执行中、2已完成、3已取消、4:异常)", example = "1")
private Integer taskStatus;
@Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3运输中、4放货中、5结束)")
@Schema(description = "任务阶段(0:待执行、1前往取货、2取货中、3前往放货、4放货中、5结束、6移动中、7:正在充电)")
private Long taskStage;
@Schema(description = "开始时间")

View File

@ -0,0 +1,97 @@
package cn.iocoder.yudao.module.system.controller.admin.wait;
import cn.iocoder.yudao.module.system.controller.admin.wait.vo.MoveToWaitPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.wait.vo.MoveToWaitRespVO;
import cn.iocoder.yudao.module.system.controller.admin.wait.vo.MoveToWaitSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.wait.MoveToWaitDO;
import cn.iocoder.yudao.module.system.service.wait.MoveToWaitService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
@Tag(name = "管理后台 - 车辆前往等待点记录")
@RestController
@RequestMapping("/wait/move-to-wait")
@Validated
public class MoveToWaitController {
@Resource
private MoveToWaitService moveToWaitService;
@PostMapping("/create")
@Operation(summary = "创建车辆前往等待点记录")
@PreAuthorize("@ss.hasPermission('wait:move-to-wait:create')")
public CommonResult<Long> createMoveToWait(@Valid @RequestBody MoveToWaitSaveReqVO createReqVO) {
return success(moveToWaitService.createMoveToWait(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新车辆前往等待点记录")
@PreAuthorize("@ss.hasPermission('wait:move-to-wait:update')")
public CommonResult<Boolean> updateMoveToWait(@Valid @RequestBody MoveToWaitSaveReqVO updateReqVO) {
moveToWaitService.updateMoveToWait(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除车辆前往等待点记录")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('wait:move-to-wait:delete')")
public CommonResult<Boolean> deleteMoveToWait(@RequestParam("id") Long id) {
moveToWaitService.deleteMoveToWait(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得车辆前往等待点记录")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('wait:move-to-wait:query')")
public CommonResult<MoveToWaitRespVO> getMoveToWait(@RequestParam("id") Long id) {
MoveToWaitDO moveToWait = moveToWaitService.getMoveToWait(id);
return success(BeanUtils.toBean(moveToWait, MoveToWaitRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得车辆前往等待点记录分页")
@PreAuthorize("@ss.hasPermission('wait:move-to-wait:query')")
public CommonResult<PageResult<MoveToWaitRespVO>> getMoveToWaitPage(@Valid MoveToWaitPageReqVO pageReqVO) {
PageResult<MoveToWaitDO> pageResult = moveToWaitService.getMoveToWaitPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, MoveToWaitRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出车辆前往等待点记录 Excel")
@PreAuthorize("@ss.hasPermission('wait:move-to-wait:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportMoveToWaitExcel(@Valid MoveToWaitPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<MoveToWaitDO> list = moveToWaitService.getMoveToWaitPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "车辆前往等待点记录.xls", "数据", MoveToWaitRespVO.class,
BeanUtils.toBean(list, MoveToWaitRespVO.class));
}
}

View File

@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.system.controller.admin.wait.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 车辆前往等待点记录分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MoveToWaitPageReqVO extends PageParam {
@Schema(description = "AGV编号")
private String robotNo;
@Schema(description = "地图字表节点id", example = "15970")
private Long positionMapItemId;
@Schema(description = "任务状态(0未开始、1前往等待点、2已到达等待点、3已离开等待点)", example = "1")
private Integer waitStatus;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,35 @@
package cn.iocoder.yudao.module.system.controller.admin.wait.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 车辆前往等待点记录 Response VO")
@Data
@ExcelIgnoreUnannotated
public class MoveToWaitRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19107")
@ExcelProperty("主键ID")
private Long id;
@Schema(description = "AGV编号")
@ExcelProperty("AGV编号")
private String robotNo;
@Schema(description = "地图字表节点id", example = "15970")
@ExcelProperty("地图字表节点id")
private Long positionMapItemId;
@Schema(description = "任务状态(0未开始、1前往等待点、2已到达等待点、3已离开等待点)", example = "1")
@ExcelProperty("任务状态(0未开始、1前往等待点、2已到达等待点、3已离开等待点)")
private Integer waitStatus;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,24 @@
package cn.iocoder.yudao.module.system.controller.admin.wait.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 车辆前往等待点记录新增/修改 Request VO")
@Data
public class MoveToWaitSaveReqVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19107")
private Long id;
@Schema(description = "AGV编号")
private String robotNo;
@Schema(description = "地图字表节点id", example = "15970")
private Long positionMapItemId;
@Schema(description = "任务状态(0未开始、1前往等待点、2已到达等待点、3已离开等待点)", example = "1")
private Integer waitStatus;
}

View File

@ -77,5 +77,9 @@ public class PositionMapItemDO extends BaseDO {
* 排序的位置,越大越优先堆放
*/
private Long locationNumber;
/**
* 等待点使用状态(0.空闲 1.使用中)
*/
private Integer useStatus;
}

View File

@ -96,7 +96,7 @@ public class RobotTaskDetailDO extends BaseDO {
*/
private Integer taskStatus;
/**
* 任务阶段(0:待执行1前往取货2取货中3运输中4放货中5结束)
* 任务阶段(0:待执行1前往取货2取货中3前往放货4放货中5结束6移动中7:正在充电)
*/
private Long taskStage;
/**

View File

@ -0,0 +1,43 @@
package cn.iocoder.yudao.module.system.dal.dataobject.wait;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 车辆前往等待点记录 DO
*
* @author 陈宾顺
*/
@TableName("robot_move_to_wait")
@KeySequence("robot_move_to_wait_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MoveToWaitDO extends BaseDO {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* AGV编号
*/
private String robotNo;
/**
* 地图字表节点id
*/
private Long positionMapItemId;
/**
* 任务状态(0未开始1前往等待点2已到达等待点3已离开等待点)
*/
private Integer waitStatus;
}

View File

@ -0,0 +1,29 @@
package cn.iocoder.yudao.module.system.dal.mysql.wait;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.system.controller.admin.wait.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.wait.MoveToWaitDO;
/**
* 车辆前往等待点记录 Mapper
*
* @author 陈宾顺
*/
@Mapper
public interface MoveToWaitMapper extends BaseMapperX<MoveToWaitDO> {
default PageResult<MoveToWaitDO> selectPage(MoveToWaitPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<MoveToWaitDO>()
.eqIfPresent(MoveToWaitDO::getRobotNo, reqVO.getRobotNo())
.eqIfPresent(MoveToWaitDO::getPositionMapItemId, reqVO.getPositionMapItemId())
.eqIfPresent(MoveToWaitDO::getWaitStatus, reqVO.getWaitStatus())
.betweenIfPresent(MoveToWaitDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MoveToWaitDO::getId));
}
}

View File

@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.system.enums.path;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum PathIsReachEnum {
REACH("REACH","到达"),
MOVE("MOVE","前进"),
START_WORK("START_WORK","开始作业"),
END_WORK("END_WORK","完成作业");
/**
* 类型
*/
private final String type;
private final String msg;
}

View File

@ -13,6 +13,8 @@ public enum PathTaskType {
TAKE_RELEASE("TAKE_RELEASE","取放货"),
CHARGE("CHARGE","充电任务"),
MOVE("MOVE","移动任务"),
MOVE_TO_WAIT("MOVE_TO_WAIT","移动到等待点(没任务时去等待点)"),
MOVE_TO_WAIT_STOP("MOVE_TO_WAIT_STOP","停车任务"),
TAKE("TAKE","仅取货"),
RELEASE("RELEASE","仅放货"),
AUTO_CHARGE("AUTO_CHARGE","自动充电");
@ -39,6 +41,8 @@ public enum PathTaskType {
return TAKE.getType();
}else if (RobotTaskTypeEnum.RELEASE.getType().equals(taskType)) {
return RELEASE.getType();
}else if (RobotTaskTypeEnum.PARK.getType().equals(taskType)) {
return MOVE_TO_WAIT_STOP.getType();
}else {
return AUTO_CHARGE.getType();
}

View File

@ -9,19 +9,11 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum CommandTypeEnum {
MOVE_POSES_AND_FORK("MOVE_POSES_AND_FORK","移动且降叉"),
WORK_PICK_UP_GOODS("WORK_PICK_UP_GOODS","取货控叉"),
WORK_DROP_OFF_GOODS("WORK_DROP_OFF_GOODS","放货控叉"),
MOVE_POSES("MOVE_POSES","移动"),
MOVE_POSE("MOVE_POSE","移动"),
JOY_AGV("JOY_AGV","遥感AGV移动"),
JOY_FORK("JOY_FORK","遥控货叉上下移动"),
SHUT_DOWN("SHUT_DOWN","关机"),
RESTART("RESTART","重启"),
STOP("STOP","停止"),
START("START","启动"),
WAIT("WAIT","等待"),
GET_PALLET_TOPIC("GET_PALLET_TOPIC","获取托盘位置"),
MOVE_TO_PALLET_POSE("MOVE_TO_PALLET_POSE","移动到取货终点"),
FORK("FORK","控制货叉上下移动");
WORK_AUTO_CHARGE("WORK_AUTO_CHARGE","自动充电"),
WORK_MANUAL_CHARGEC("WORK_MANUAL_CHARGEC","手动充电");
/**
* 类型
*/

View File

@ -6,6 +6,8 @@ import lombok.Getter;
@Getter
@AllArgsConstructor
public enum RobotCommandTypeEnum {
MOVE_POSES("MOVE_POSES","移动"),
WORK_START_CHARGE("WORK_START_CHARGE","充电"),
WORD_PICK_UP_GOODS("WORD_PICK_UP_GOODS","取货"),
WORD_DROP_OFF_GOODS("WORD_DROP_OFF_GOODS","放货");
/**

View File

@ -1,11 +1,14 @@
/*
package cn.iocoder.yudao.module.system.enums.robot.task;
import lombok.AllArgsConstructor;
import lombok.Getter;
*/
/**
* RobotAcceptTaskDTO的order_type
*/
*//*
@Getter
@AllArgsConstructor
public enum RobotTaksOrderTypeEnum {
@ -13,8 +16,11 @@ public enum RobotTaksOrderTypeEnum {
AUTO_MOVE("AUTO_MOVE"), //自动移库任务
TASK("TASK"), //客户下发的任务
AUTO_CHARGE("AUTO_CHARGE"); //自动充电任务
*/
/**
* 类型
*/
*//*
private final String type;
}
*/

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.system.enums.robot.task;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum RobotTaskStageEnum {
UN_START(0L,"待执行"),
GO_TAKE(1L,"前往取货"),
TAKEING(2L,"取货中"),
GO_RELEASE(3L,"前往放货"),
RELEASEING(4L,"放货中"),
DONE(5L,"结束"),
MOVE(6L,"移动中"),
CHARGEING(7L,"待执行正在充电");
/**
* 类型
*/
private final Long type;
private final String msg;
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.system.enums.wait;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 任务状态(0未开始1前往等待点2已到达等待点3已离开等待点)
*/
@Getter
@AllArgsConstructor
public enum WaitStatusEnum {
UN_START(0,"未开始"),
GO_TO_WAIT(1,"前往等待点"),
REACH_WAIT(2,"已到达等待点"),
LEAVE_WAIT(3,"已离开等待点");
/**
* 类型
*/
private final Integer type;
private final String msg;
}

View File

@ -45,11 +45,11 @@ public class HouseLocationStrategyImpl implements NodeProcessingStrategy {
// -- 筛选出 库位编号不为空 - 并且第最后一组数据 最大的值 - 如果没有则为0
int max = wareHouseLocationDOS.stream().map(WareHouseLocationDO::getLocationNo).filter(StrUtil::isNotEmpty)
.mapToInt(s -> Integer.parseInt(s.substring(s.length() - 1))).max().orElse(1);
int locationStorey = wareHouseLocationDOS.size();
Long locationNumber = null;
if (ObjectUtil.isNotEmpty(item.getLocationNumber())) {
locationNumber = item.getLocationNumber();
}
int locationStorey = 1;
for (WareHouseLocationDO wareHouseLocationDO : wareHouseLocationDOS) {
wareHouseLocationDO.setLocationX(item.getLocationX());
wareHouseLocationDO.setLocationY(item.getLocationY());
@ -58,6 +58,8 @@ public class HouseLocationStrategyImpl implements NodeProcessingStrategy {
if (wareHouseLocationDO.getId() == null) {
wareHouseLocationDO.setId(getId());
}
wareHouseLocationDO.setLocationStorey(locationStorey);
locationStorey ++;
if (StrUtil.isEmpty(wareHouseLocationDO.getLocationNo())) {
// -- 生成库位编号 -
String locationNo = String.format(KW_NO_FORMAT, positionMapId, RandomUtil.randomNumbers(4), max++);
@ -69,8 +71,6 @@ public class HouseLocationStrategyImpl implements NodeProcessingStrategy {
wareHouseLocationDO.setLocationNumber(locationNumber);
locationNumber = locationNumber - 10;
}
wareHouseLocationDO.setLocationStorey(locationStorey);
locationStorey = locationStorey+1;
newList.add(wareHouseLocationDO);
}
item.setDataJson(JSONUtil.toJsonStr(wareHouseLocationDOS));

View File

@ -29,4 +29,13 @@ public interface PathPlanningService {
* @param message
*/
void sendPosedsToRobot(String message);
/**
* 同步PP任务状态
* @param orderId
* @param robotNo
* @param s
* @param type
*/
void updateBehavior(String orderId, String robotNo, String s, String type);
}

View File

@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.mqtt.api.common.CommonApi;
import cn.iocoder.yudao.module.mqtt.api.path.PathPlanningApi;
import cn.iocoder.yudao.module.mqtt.api.path.dto.*;
import cn.iocoder.yudao.module.mqtt.api.path.task.TaskPathPlanningDTO;
import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant;
import cn.iocoder.yudao.module.system.constant.robot.RobotTopicConstant;
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO;
@ -386,6 +387,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
/**
* 发送路径给车机
*
* @param message
*/
@Override
@ -396,6 +398,20 @@ public class PathPlanningServiceImpl implements PathPlanningService {
commonApi.commonMethod(message, topic);
}
/**
* 实时行为上报
* @param orderId
* @param robotNo
* @param behaviorId
* @param isReach
*/
@Override
public void updateBehavior(String orderId, String robotNo, String behaviorId, String isReach) {
TaskPathPlanningDTO build = TaskPathPlanningDTO.builder().orderId(orderId).robotNo(robotNo)
.behaviorId(behaviorId).isReach(isReach).build();
commonApi.commonMethod(build, PathPlanningTopicConstant.UPDATE_BEHAVIOR);
}
public PositionMapLineDTO setPositionMapLineDTOData(PositionMapLineDTO positionMapLineDO) {
PositionMapLineDTO build = PositionMapLineDTO.builder()
.id(positionMapLineDO.getId())

View File

@ -10,11 +10,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.mqtt.api.common.CommonApi;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAssignTaskArgDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAssignTaskDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAssignTaskDataDTO;
import cn.iocoder.yudao.module.mqtt.enums.path.TaskTypeEnum;
import cn.iocoder.yudao.module.mqtt.api.task.dto.*;
import cn.iocoder.yudao.module.mqtt.enums.task.ExecutionTypeEnum;
import cn.iocoder.yudao.module.system.api.path.vo.RobotClosePathPlantingDTO;
import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataPoseDTO;
@ -53,7 +49,6 @@ import cn.iocoder.yudao.module.system.enums.redis.RobotCacheLockEnum;
import cn.iocoder.yudao.module.system.enums.robot.*;
import cn.iocoder.yudao.module.system.enums.robot.charge.ChargeTaskStatusEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotCommandTypeEnum;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaksOrderTypeEnum;
//import cn.iocoder.yudao.module.system.service.robot.job.RobotCommonTaskService;
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
import cn.iocoder.yudao.module.system.util.redis.RedissonUtils;
@ -136,12 +131,12 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
@Value("${zn.task.check_sku_info:true}")
private Boolean checkSkuInfo;
@Value("${zn.robot_config.check_pallet_height}")
private Double checkPalletHeight;
@Value("${zn.robot_config.offset_height}")
private Double offsetHeight;
@Value("${zn.robot_config.default_tray_height:1.0}")
private Double defaultTrayHeight;
@Resource
private WareHouseLaneMapper houseLaneMapper;
@ -397,7 +392,6 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
robotTask.setOrder_id(taskDetailDO.getId().toString());
String mac = robotInformationService.getMacByRobotNo(taskDetailDO.getRobotNo());
robotTask.setTopic(RobotTopicConstant.ROBOT_TASK_TOPIC + mac);
robotTask.setOrder_type(RobotTaksOrderTypeEnum.TASK.getType());
robotTask.setExecution_type(ExecutionTypeEnum.CANCEL.getType());
commonApi.commonMethod(robotTask, robotTask.getTopic());
@ -487,9 +481,8 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
robotTaskDetailDO = setTaskDoing(detailId, taskAssignDTO.getRobotNo(), deviceNoMap);
}
if (ObjectUtil.isNotEmpty(robotTaskDetailDO)) {
sendTaskToRobot(robotTaskDetailDO, taskAssignDTO);
}
}
/**
@ -498,62 +491,79 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
* @param v
*/
private void sendTaskToRobot(RobotTaskDetailDO v, TaskAssignDTO taskAssignDTO) {
String mac = robotInformationService.getMacByRobotNo(v.getRobotNo());
String orderType = PathTaskType.getTaskType(v.getTaskType());
String mac = robotInformationService.getMacByRobotNo(taskAssignDTO.getRobotNo());
RobotAssignTaskDataDTO robotAssignTask = getEmptyRobotAssignTaskData();
RobotAssignTaskDTO build = RobotAssignTaskDTO.builder()
.topic(RobotTopicConstant.ROBOT_TASK_TOPIC + mac)
.order_type(orderType)
.order_id(v.getId().toString())
.orderType(taskAssignDTO.getType())
.executionType(ExecutionTypeEnum.DEFAULT.getType())
.orderId(taskAssignDTO.getId().toString())
.data(Lists.newArrayList(robotAssignTask))
.build();
if (PathTaskType.TAKE_RELEASE.getType().equals(taskAssignDTO.getType())
|| PathTaskType.TAKE.getType().equals(taskAssignDTO.getType())
|| PathTaskType.RELEASE.getType().equals(taskAssignDTO.getType())) {
List<RobotAssignTaskDataDTO> robotAssignTaskData = getRobotAssignTaskData(v,taskAssignDTO);
build.setData(robotAssignTaskData);
RobotAssignTaskDataDTO robotAssignTaskData = getRobotAssignTaskData(v, taskAssignDTO);
List<RobotAssignTaskDataDTO> data = build.getData();
data.add(robotAssignTaskData);
} else if (PathTaskType.CHARGE.getType().equals(taskAssignDTO.getType())
|| PathTaskType.AUTO_CHARGE.getType().equals(taskAssignDTO.getType())) {
RobotAssignTaskDataDTO robotAssignTaskData = new RobotAssignTaskDataDTO();
robotAssignTaskData.setCommandType(RobotCommandTypeEnum.WORK_START_CHARGE.getType());
List<RobotAssignTaskDataDTO> data = build.getData();
data.add(robotAssignTaskData);
}
log.info("发送任务给车机 :{}", JSON.toJSONString(build));
commonApi.commonMethod(build, build.getTopic());
}
public List<RobotAssignTaskDataDTO> getRobotAssignTaskData(RobotTaskDetailDO v,TaskAssignDTO taskAssignDTO) {
public RobotAssignTaskDataDTO getEmptyRobotAssignTaskData() {
RobotAssignTaskDataDTO take = new RobotAssignTaskDataDTO();
take.setCommandType(RobotCommandTypeEnum.MOVE_POSES.getType());
List<Pose2ds> pose2ds = new ArrayList<>();
RobotAssignTaskArgDTO build = RobotAssignTaskArgDTO.builder().pose2ds(pose2ds).build();
take.setArg(Arrays.asList(build));
return take;
}
RobotAssignTaskDataDTO take = null;
RobotAssignTaskDataDTO release = null;
public RobotAssignTaskDataDTO getRobotAssignTaskData(RobotTaskDetailDO v, TaskAssignDTO taskAssignDTO) {
RobotAssignTaskDataDTO take = new RobotAssignTaskDataDTO();
RobotAssignTaskArgDTO build = null;
WareHouseLocationDO location = null;
if (PathTaskType.TAKE_RELEASE.getType().equals(taskAssignDTO.getType()) ||
PathTaskType.TAKE.getType().equals(taskAssignDTO.getType())) {
take = new RobotAssignTaskDataDTO();
take.setCommand_type(RobotCommandTypeEnum.WORD_PICK_UP_GOODS.getType());
WareHouseLocationDO location = locationMapper.selectById(v.getFromLocationId());
RobotAssignTaskArgDTO build = RobotAssignTaskArgDTO.builder()
take.setCommandType(RobotCommandTypeEnum.WORD_PICK_UP_GOODS.getType());
location = locationMapper.selectById(v.getFromLocationId());
build = RobotAssignTaskArgDTO.builder()
.level(Double.valueOf(location.getLocationStorey()))
.height(Double.valueOf(location.getLocationTrayHeight() + ""))
.check_pallet_height(checkPalletHeight)
.offset_height(offsetHeight)
.offsetHeight(offsetHeight)
.build();
take.setArg(Arrays.asList(build));
}
if (PathTaskType.TAKE_RELEASE.getType().equals(taskAssignDTO.getType()) ||
PathTaskType.RELEASE.getType().equals(taskAssignDTO.getType())) {
release = new RobotAssignTaskDataDTO();
release.setCommand_type(RobotCommandTypeEnum.WORD_DROP_OFF_GOODS.getType());
WareHouseLocationDO location = locationMapper.selectById(v.getToLocationId());
RobotAssignTaskArgDTO build = RobotAssignTaskArgDTO.builder()
} else if (PathTaskType.RELEASE.getType().equals(taskAssignDTO.getType())) {
take.setCommandType(RobotCommandTypeEnum.WORD_DROP_OFF_GOODS.getType());
location = locationMapper.selectById(v.getToLocationId());
build = RobotAssignTaskArgDTO.builder()
.level(Double.valueOf(location.getLocationStorey()))
.height(Double.valueOf(location.getLocationTrayHeight() + ""))
.check_pallet_height(checkPalletHeight)
.offset_height(offsetHeight)
.offsetHeight(offsetHeight)
.build();
release.setArg(Arrays.asList(build));
}
List<RobotAssignTaskDataDTO> list = new ArrayList<>();
if (ObjectUtil.isNotEmpty(take)) {
list.add(take);
if (ObjectUtil.isEmpty(location.getLocationTrayHeight())) {
setRobotAssignTaskArgHeigth(location, build);
} else {
build.setHeight(Double.valueOf(location.getLocationTrayHeight() + ""));
}
if (ObjectUtil.isNotEmpty(release)) {
list.add(release);
take.setArg(Arrays.asList(build));
return take;
}
return list;
private void setRobotAssignTaskArgHeigth(WareHouseLocationDO location, RobotAssignTaskArgDTO build) {
Integer locationStorey = location.getLocationStorey() - 1;
double height = locationStorey * defaultTrayHeight;
build.setHeight(height);
}
public RobotTaskDetailDO setTaskDoing(Long detailId, String robotNo, Map<Long, String> deviceNoMap) {

View File

@ -8,13 +8,7 @@ import cn.iocoder.yudao.module.mqtt.api.path.task.TaskLimitationAreaDTO;
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.RobotTaskApi;
import cn.iocoder.yudao.module.mqtt.api.task.dto.Pose2ds;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskDTO;
import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskData;
import cn.iocoder.yudao.module.mqtt.enums.path.TaskTypeEnum;
import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant;
import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant;
import cn.iocoder.yudao.module.system.constant.robot.RobotTopicConstant;
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO;
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO;
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotChargeLogDO;
@ -27,6 +21,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapMapper;
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;
import cn.iocoder.yudao.module.system.enums.path.PathTaskType;
import cn.iocoder.yudao.module.system.enums.robot.*;
import cn.iocoder.yudao.module.system.enums.robot.charge.ChargeModelEnum;
import cn.iocoder.yudao.module.system.service.robot.job.DistributeTasksService;
@ -167,9 +162,10 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
priority = taskDetailMap.get(v.getTaskDetailId()).getPriority();
}
String orderType = ObjectUtil.isEmpty(v.getTaskDetailId()) ? PathTaskType.AUTO_CHARGE.getType():PathTaskType.CHARGE.getType();
TaskToPathPlanningDTO pathPlanning = TaskToPathPlanningDTO.builder()
.id(String.valueOf(v.getId()))
.type(TaskTypeEnum.CHARGE.getType())
.orderId(String.valueOf(v.getId()))
.orderType(orderType)
.priority(priority)
.createTime(createTime)
.build();
@ -223,8 +219,8 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
for (RobotTaskDetailDO taskDetailDO : taskDetailDOS) {
TaskToPathPlanningDTO pathPlanning = TaskToPathPlanningDTO.builder()
.id(String.valueOf(taskDetailDO.getId()))
.type(TaskTypeEnum.TASK.getType())
.orderId(String.valueOf(taskDetailDO.getId()))
.orderType(PathTaskType.getTaskType(taskDetailDO.getTaskType()))
.priority(taskDetailDO.getPriority())
.createTime(taskDetailDO.getCreateTime())
.build();

View File

@ -19,7 +19,6 @@ import cn.iocoder.yudao.module.system.dal.mysql.config.CommonConfigMapper;
import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotWarnMsgMapper;
import cn.iocoder.yudao.module.system.enums.config.CommandConfigTypeEnum;
import cn.iocoder.yudao.module.system.enums.robot.RobotWarnType;
import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaksOrderTypeEnum;
import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
import cn.iocoder.yudao.module.system.service.robot.RobotWarnMsgService;
import com.alibaba.fastjson.JSON;
@ -95,7 +94,6 @@ public class ToolsServiceImpl implements ToolsService {
/**
* 清除交管
*
* @param agvNo
* @return
*/
@Override
@ -123,7 +121,6 @@ public class ToolsServiceImpl implements ToolsService {
robotTask.setOrder_id(taskDetailId);
String mac = robotInformationService.getMacByRobotNo(informationDO.getRobotNo());
robotTask.setTopic(RobotTopicConstant.ROBOT_TASK_TOPIC + mac);
robotTask.setOrder_type(RobotTaksOrderTypeEnum.TASK.getType());
robotTask.setExecution_type(ExecutionTypeEnum.CANCEL.getType());
commonApi.commonMethod(robotTask, robotTask.getTopic());

View File

@ -0,0 +1,56 @@
package cn.iocoder.yudao.module.system.service.wait;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.module.system.controller.admin.wait.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.wait.MoveToWaitDO;
/**
* 车辆前往等待点记录 Service 接口
*
* @author 陈宾顺
*/
public interface MoveToWaitService {
/**
* 创建车辆前往等待点记录
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createMoveToWait(@Valid MoveToWaitSaveReqVO createReqVO);
/**
* 更新车辆前往等待点记录
*
* @param updateReqVO 更新信息
*/
void updateMoveToWait(@Valid MoveToWaitSaveReqVO updateReqVO);
/**
* 删除车辆前往等待点记录
*
* @param id 编号
*/
void deleteMoveToWait(Long id);
/**
* 获得车辆前往等待点记录
*
* @param id 编号
* @return 车辆前往等待点记录
*/
MoveToWaitDO getMoveToWait(Long id);
/**
* 获得车辆前往等待点记录分页
*
* @param pageReqVO 分页查询
* @return 车辆前往等待点记录分页
*/
PageResult<MoveToWaitDO> getMoveToWaitPage(MoveToWaitPageReqVO pageReqVO);
void setMoveToWaitDoing(Long orderId,Integer status);
}

View File

@ -0,0 +1,82 @@
package cn.iocoder.yudao.module.system.service.wait;
import cn.iocoder.yudao.module.system.controller.admin.wait.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.wait.MoveToWaitDO;
import cn.iocoder.yudao.module.system.dal.mysql.wait.MoveToWaitMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
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 static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MOVE_TO_WAIT_NOT_EXISTS;
/**
* 车辆前往等待点记录 Service 实现类
*
* @author 陈宾顺
*/
@Service
@Validated
public class MoveToWaitServiceImpl implements MoveToWaitService {
@Resource
private MoveToWaitMapper moveToWaitMapper;
@Override
public Long createMoveToWait(MoveToWaitSaveReqVO createReqVO) {
// 插入
MoveToWaitDO moveToWait = BeanUtils.toBean(createReqVO, MoveToWaitDO.class);
moveToWaitMapper.insert(moveToWait);
// 返回
return moveToWait.getId();
}
@Override
public void updateMoveToWait(MoveToWaitSaveReqVO updateReqVO) {
// 校验存在
validateMoveToWaitExists(updateReqVO.getId());
// 更新
MoveToWaitDO updateObj = BeanUtils.toBean(updateReqVO, MoveToWaitDO.class);
moveToWaitMapper.updateById(updateObj);
}
@Override
public void deleteMoveToWait(Long id) {
// 校验存在
validateMoveToWaitExists(id);
// 删除
moveToWaitMapper.deleteById(id);
}
private void validateMoveToWaitExists(Long id) {
if (moveToWaitMapper.selectById(id) == null) {
throw exception(MOVE_TO_WAIT_NOT_EXISTS);
}
}
@Override
public MoveToWaitDO getMoveToWait(Long id) {
return moveToWaitMapper.selectById(id);
}
@Override
public PageResult<MoveToWaitDO> getMoveToWaitPage(MoveToWaitPageReqVO pageReqVO) {
return moveToWaitMapper.selectPage(pageReqVO);
}
@Override
public void setMoveToWaitDoing(Long orderId,Integer status) {
MoveToWaitDO updateObj = new MoveToWaitDO();
updateObj.setId(orderId);
updateObj.setWaitStatus(status);
moveToWaitMapper.updateById(updateObj);
}
}

View File

@ -245,14 +245,14 @@ zn:
scan: 机器人正在扫描
parking_space: 机器人正在前往停车位
charge: 机器人正在前往充电位
action_entity_cache_time: 28800 #机器人所有动作缓存时间 8小时
doing_action_cache_time: 28800 #单个动作缓存时间 8小时
action_entity_cache_time: 172800 #机器人所有动作缓存时间 8小时
doing_action_cache_time: 172800 #单个动作缓存时间 8小时
robot_chearg: #机器人充电的配置
release_location_number_config: 50 #同一组序号,越大越先执行
priority_config: 50 #优先级
task: #任务相关的配置
check_sku_info: true #校验物料信息
robot_config: #机器人取放货默认配置
check_pallet_height: 0.0 #检测托盘时需要抬叉的高度,现在是需要,以后不用了
offset_height: 0.1 #叉起货需要在原来高度基础上偏移的高度
default_tray_height: 1.1 #默认每层高度

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.wait.MoveToWaitMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>