任务状态
This commit is contained in:
parent
908ac015ca
commit
df8c8b28c6
@ -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;
|
||||
}
|
@ -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 + 点位号
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -6,6 +6,6 @@ import java.util.List;
|
||||
|
||||
@Data
|
||||
public class RobotAssignTaskDataDTO {
|
||||
private String command_type;
|
||||
private String commandType;
|
||||
private List<RobotAssignTaskArgDTO> arg;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
*/
|
||||
|
@ -18,5 +18,5 @@ public interface RobotTaskStatusApi {
|
||||
|
||||
@PostMapping(PREFIX + "/updateStatus")
|
||||
@Operation(summary = "机器人完成任务上报")
|
||||
CommonResult<Boolean> robotDoneTask(@RequestBody RobotCompleteTaskDTO robotCompleteTaskDTO);
|
||||
void robotDoneTask(@RequestBody RobotCompleteTaskDTO robotCompleteTaskDTO);
|
||||
}
|
||||
|
@ -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;
|
||||
/**
|
||||
* 失败时的错误原因
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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, "车辆前往等待点记录不存在");
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -83,7 +83,7 @@ public class PathPlanningTopicConstant {
|
||||
/**
|
||||
* 实时行为上报
|
||||
*/
|
||||
public static String UPDATE_ACTION = "UPDATE_ACTION";
|
||||
public static String UPDATE_BEHAVIOR = "UPDATE_BEHAVIOR";
|
||||
|
||||
|
||||
}
|
||||
|
@ -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:";
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -52,4 +52,7 @@ public class PositionMapItemPageReqVO extends PageParam {
|
||||
@Schema(description = "排序的位置,越大越优先堆放")
|
||||
private Long locationNumber;
|
||||
|
||||
@Schema(description = "等待点使用状态(0.空闲 1.使用中)")
|
||||
private Integer useStatus;
|
||||
|
||||
}
|
||||
|
@ -70,4 +70,8 @@ public class PositionMapItemRespVO {
|
||||
@ExcelProperty("排序的位置,越大越优先堆放")
|
||||
private Long locationNumber;
|
||||
|
||||
@Schema(description = "等待点使用状态(0.空闲 1.使用中)")
|
||||
@ExcelProperty("等待点使用状态(0.空闲 1.使用中)")
|
||||
private Integer useStatus;
|
||||
|
||||
}
|
||||
|
@ -42,4 +42,7 @@ public class PositionMapItemSaveReqVO {
|
||||
|
||||
@Schema(description = "排序的位置,越大越优先堆放")
|
||||
private Long locationNumber;
|
||||
|
||||
@Schema(description = "等待点使用状态(0.空闲 1.使用中)")
|
||||
private Integer useStatus;
|
||||
}
|
||||
|
@ -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 = "开始时间")
|
||||
|
@ -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 = "开始时间")
|
||||
|
@ -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 = "开始时间")
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -77,5 +77,9 @@ public class PositionMapItemDO extends BaseDO {
|
||||
* 排序的位置,越大越优先堆放
|
||||
*/
|
||||
private Long locationNumber;
|
||||
/**
|
||||
* 等待点使用状态(0.空闲 1.使用中)
|
||||
*/
|
||||
private Integer useStatus;
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
/**
|
||||
|
@ -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") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 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;
|
||||
|
||||
}
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
@ -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();
|
||||
}
|
||||
|
@ -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","手动充电");
|
||||
/**
|
||||
* 类型
|
||||
*/
|
||||
|
@ -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","放货");
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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));
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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())
|
||||
|
@ -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) {
|
||||
|
@ -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();
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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 #默认每层高度
|
||||
|
||||
|
@ -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>
|
Loading…
Reference in New Issue
Block a user