车辆移动指令
This commit is contained in:
parent
a57374f2c0
commit
908ac015ca
@ -0,0 +1,19 @@
|
||||
package cn.iocoder.yudao.module.mqtt.api.path.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PathPosedsDTO {
|
||||
private String order_id;
|
||||
private String order_type;
|
||||
private String robotNo;
|
||||
private List<PathPosedsDataDTO> data;
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package cn.iocoder.yudao.module.mqtt.api.path.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PathPosedsDataArgDTO {
|
||||
private List<PathPosedsDataArgPosedDTO> pose2ds;
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package cn.iocoder.yudao.module.mqtt.api.path.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PathPosedsDataArgPosedDTO {
|
||||
@Schema(description = "唯一key,导航下发给RCS应用", example = "20863")
|
||||
private Integer poseId;
|
||||
|
||||
private Double x;
|
||||
|
||||
private Double y;
|
||||
|
||||
private Double yaw;
|
||||
|
||||
@Schema(description = "开始控制点x轴")
|
||||
private Double beginControlX;
|
||||
|
||||
@Schema(description = "开始控制点y轴")
|
||||
private Double beginControlY;
|
||||
|
||||
@Schema(description = "结束控制点x轴")
|
||||
private Double endControlX;
|
||||
|
||||
@Schema(description = "结束控制点y轴")
|
||||
private Double endControlY;
|
||||
|
||||
@Schema(description = "是否是新路径,存在旧路径表示有切换任务,只有新路径表示无切换任务", example = "20863")
|
||||
private Integer isNewPose;
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package cn.iocoder.yudao.module.mqtt.api.path.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PathPosedsDataDTO {
|
||||
private PathPosedsDataArgDTO arg;
|
||||
private Integer is_work;
|
||||
}
|
@ -143,6 +143,8 @@ public class MqttFactory {
|
||||
return BeanUtils.getBean(PathPlanningDistributionTaskServiceImpl.class);
|
||||
case TASK_ASSIGNMENT_FAIL:
|
||||
return BeanUtils.getBean(PathPlanningDistributionFailServiceImpl.class);
|
||||
case ROBOT_TASK_MOVE:
|
||||
return BeanUtils.getBean(PathPlanningMoveServiceImpl.class);
|
||||
default :
|
||||
return BeanUtils.getBean(RobotTaskStatusServiceImpl.class);
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ public enum DefineSubTopicEnum {
|
||||
ROBOT_GENERICS_STATUS("ROBOT_GENERICS_STATUS", 0,"机器人异常"),
|
||||
SYNCHRONOUS_ALL_MAP_REQUEST("SYNCHRONOUS_ALL_MAP_REQUEST", 0,"路径规划需要初始数据上报"),
|
||||
TASK_ASSIGNMENT_FEEDBACK("TASK_ASSIGNMENT_FEEDBACK", 0,"路径规划任务分配上报"),
|
||||
ROBOT_TASK_MOVE ("ROBOT_TASK_MOVE ", 0,"路径规划上报实时路径"),
|
||||
TASK_ASSIGNMENT_FAIL("TASK_ASSIGNMENT_FAIL", 0,"路径规划失败上报");
|
||||
|
||||
|
||||
|
@ -0,0 +1,21 @@
|
||||
package cn.iododer.yudao.module.mqtt.service;
|
||||
|
||||
import cn.iocoder.yudao.module.system.api.path.PathApi;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class PathPlanningMoveServiceImpl implements MqttService{
|
||||
|
||||
@Resource
|
||||
private PathApi pathApi;
|
||||
|
||||
@Override
|
||||
public void analysisMessage(String message) {
|
||||
log.info("收到路径规划的消息");
|
||||
pathApi.pathPlanningMove(message);
|
||||
}
|
||||
}
|
@ -24,4 +24,8 @@ public interface PathApi {
|
||||
@PostMapping(PREFIX + "/ppDistributionTaskFail")
|
||||
@Operation(summary = "路径规划需要初始化信息")
|
||||
void ppDistributionTaskFail(@RequestParam("message") String message);
|
||||
|
||||
@PostMapping(PREFIX + "/pathPlanningMove")
|
||||
@Operation(summary = "路径规划需要初始化信息")
|
||||
void pathPlanningMove(@RequestParam("message") String message);
|
||||
}
|
||||
|
@ -85,5 +85,13 @@ public class PathApiImpl implements PathApi {
|
||||
warnMsgService.addWarnMsg(message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pathPlanningMove(String message) {
|
||||
log.info("收到路径规划路径的消息 :{}", message);
|
||||
taskExecutor.execute(() -> {
|
||||
pathPlanningService.sendPosedsToRobot(message);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -80,5 +80,10 @@ public class PathPlanningTopicConstant {
|
||||
*/
|
||||
public static String CLEAN_AGV = "CLEAN_AGV";
|
||||
|
||||
/**
|
||||
* 实时行为上报
|
||||
*/
|
||||
public static String UPDATE_ACTION = "UPDATE_ACTION";
|
||||
|
||||
|
||||
}
|
||||
|
@ -8,4 +8,8 @@ public class RobotTopicConstant {
|
||||
* 下发任务给车机的topic (拼接mac地址)
|
||||
*/
|
||||
public static String ROBOT_TASK_TOPIC = "ROBOT_TASK_";
|
||||
/**
|
||||
* 下发让车子移动
|
||||
*/
|
||||
public static String ROBOT_TASK_MOVE_TOPIC = "ROBOT_TASK_MOVE";
|
||||
}
|
||||
|
@ -2,16 +2,17 @@ package cn.iocoder.yudao.module.system.controller.admin.tool;
|
||||
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotInformationSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.service.tool.ToolsService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.Valid;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
|
||||
@ -21,6 +22,20 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
@Validated
|
||||
public class ToolsController {
|
||||
|
||||
@Resource
|
||||
private ToolsService toolsService;
|
||||
|
||||
@PostMapping("/cleanAgv")
|
||||
@Operation(summary = "路径规划---清除交管")
|
||||
@PreAuthorize("@ss.hasPermission('robot:information:cleanAgv')")
|
||||
public CommonResult<String> cleanAgv(@Valid @RequestParam @NotBlank(message = "请传机器人编号") String robotNo) {
|
||||
return success(toolsService.cleanAgv(robotNo));
|
||||
}
|
||||
|
||||
@PostMapping("/closeTaskDetail")
|
||||
@Operation(summary = "关闭任务(同步路径规划和车机)-不改变数据库任务状态")
|
||||
@PreAuthorize("@ss.hasPermission('robot:information:closeTaskDetail')")
|
||||
public CommonResult<String> closeTaskDetail(@Valid @RequestParam @NotBlank(message = "请传任务id") String taskDetailId) {
|
||||
return success(toolsService.closeTaskDetail(taskDetailId));
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,14 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.tool.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class CleanAgvDTO {
|
||||
private String robotNo;
|
||||
}
|
@ -46,25 +46,6 @@ public class RobotJob {
|
||||
@Autowired
|
||||
private RobotPathPlanningService robotPathPlanningService;
|
||||
|
||||
//下发任务给车机---废弃---因为这一版没有结合路径规划
|
||||
// @XxlJob("DistributeTasksJob")
|
||||
@TenantJob
|
||||
public void distributeTasksJob() throws InterruptedException {
|
||||
log.info("----下发任务给车机----");
|
||||
RLock lock = redissonUtils.getLock(RobotCacheLockEnum.ROBOT_TASK_DISTRIBUTE_LOCK.getKey());
|
||||
if (lock.tryLock()){
|
||||
try {
|
||||
distributeTasksService.distributeTasks();
|
||||
} catch (Exception e) {
|
||||
log.error("下发任务给车机出现异常 :{}",e);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}else {
|
||||
log.info("下发任务未获取到锁");
|
||||
throw exception(REDISSON_NOT_OBTAIN_LOCK);
|
||||
}
|
||||
}
|
||||
|
||||
//下发自动移库任务--- 废弃---产品不要自动移库
|
||||
// @XxlJob("DistributeAutoMoveJob")
|
||||
|
@ -23,4 +23,10 @@ public interface PathPlanningService {
|
||||
void synchronousItemUpdate(PositionMapItemSaveReqVO positionMapItemSaveReqVO);
|
||||
|
||||
void robotDimensions();
|
||||
|
||||
/**
|
||||
* 发送路径给车机
|
||||
* @param message
|
||||
*/
|
||||
void sendPosedsToRobot(String message);
|
||||
}
|
||||
|
@ -2,12 +2,15 @@ package cn.iocoder.yudao.module.system.service.path;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
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.system.constant.path.PathPlanningTopicConstant;
|
||||
import cn.iocoder.yudao.module.system.constant.robot.RobotTopicConstant;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapItemSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapLineSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.robot.task.TaskAssignDTO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItemDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapLineDO;
|
||||
@ -18,7 +21,10 @@ 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.enums.line.DirectionEnum;
|
||||
import cn.iocoder.yudao.module.system.enums.path.PathTypeEnum;
|
||||
import cn.iocoder.yudao.module.system.service.robot.RobotInformationService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@ -59,6 +65,12 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
@Resource
|
||||
private RobotInformationMapper informationMapper;
|
||||
|
||||
@Autowired
|
||||
private RobotInformationService robotInformationService;
|
||||
|
||||
@Resource
|
||||
private CommonApi commonApi;
|
||||
|
||||
/**
|
||||
* 同步ware_position_map_line的点位信息
|
||||
*/
|
||||
@ -372,6 +384,18 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
pathPlanningApi.synchronousLineObject(list, PathPlanningTopicConstant.SEND_ROBOT_DIMENSIONS);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送路径给车机
|
||||
* @param message
|
||||
*/
|
||||
@Override
|
||||
public void sendPosedsToRobot(String message) {
|
||||
PathPosedsDTO pathPosedsDTO = JSON.parseObject(message, PathPosedsDTO.class);
|
||||
String mac = robotInformationService.getMacByRobotNo(pathPosedsDTO.getRobotNo());
|
||||
String topic = RobotTopicConstant.ROBOT_TASK_MOVE_TOPIC+mac;
|
||||
commonApi.commonMethod(message, topic);
|
||||
}
|
||||
|
||||
public PositionMapLineDTO setPositionMapLineDTOData(PositionMapLineDTO positionMapLineDO) {
|
||||
PositionMapLineDTO build = PositionMapLineDTO.builder()
|
||||
.id(positionMapLineDO.getId())
|
||||
|
@ -131,4 +131,6 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
|
||||
* @return
|
||||
*/
|
||||
List<RobotInformationDO> getListByMapId(Long mapId);
|
||||
|
||||
RobotInformationDO getRobotInformationByDetailId(String taskDetailId);
|
||||
}
|
||||
|
@ -558,4 +558,12 @@ public class RobotInformationServiceImpl extends ServiceImpl<RobotInformationMap
|
||||
public List<RobotInformationDO> getListByMapId(Long mapId) {
|
||||
return informationMapper.getListByMapId(mapId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RobotInformationDO getRobotInformationByDetailId(String taskDetailId) {
|
||||
RobotInformationDO robotInformationDO = informationMapper.selectOne(new LambdaQueryWrapper<RobotInformationDO>()
|
||||
.eq(RobotInformationDO::getTaskDetailId, taskDetailId)
|
||||
.last("limit 1"));
|
||||
return robotInformationDO;
|
||||
}
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ public interface RobotTaskService extends IService<RobotTaskDO> {
|
||||
* PP分配的任务
|
||||
* @param message
|
||||
*/
|
||||
void ppDistributionTask(String message);
|
||||
// void ppDistributionTask(String message);
|
||||
|
||||
/**
|
||||
* 任务日志分页
|
||||
|
@ -54,7 +54,7 @@ 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.service.robot.job.RobotCommonTaskService;
|
||||
import cn.iocoder.yudao.module.system.util.redis.RedisUtil;
|
||||
import cn.iocoder.yudao.module.system.util.redis.RedissonUtils;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
@ -124,9 +124,6 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
|
||||
@Resource
|
||||
private RobotInformationMapper robotInformationMapper;
|
||||
|
||||
@Resource
|
||||
private RobotCommonTaskService robotCommonTaskService;
|
||||
|
||||
@Autowired
|
||||
private RobotInformationService robotInformationService;
|
||||
|
||||
@ -1142,7 +1139,7 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
|
||||
*
|
||||
* @param message
|
||||
*/
|
||||
@Override
|
||||
/* @Override
|
||||
@Deprecated
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void ppDistributionTask(String message) {
|
||||
@ -1158,9 +1155,9 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
|
||||
Map<Long, String> deviceNoMap = new HashMap<>();
|
||||
RobotChargeLogDO robotChargeLogs = null;
|
||||
|
||||
/**
|
||||
*//**
|
||||
* 充电
|
||||
*/
|
||||
*//*
|
||||
if (TaskTypeEnum.CHARGE.getType().equals(distribution.getType())) {
|
||||
robotChargeLogs = chargeLogMapper.selectById(distribution.getId());
|
||||
|
||||
@ -1174,9 +1171,9 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*//**
|
||||
* 任务
|
||||
*/
|
||||
*//*
|
||||
if (TaskTypeEnum.TASK.getType().equals(distribution.getType())) {
|
||||
chargeDone(distribution.getRobotNo());
|
||||
robotInformationMapper.updateRobotListStatus(distribution.getRobotNo(), RobotStatusEnum.DOING.getType(), distribution.getId());
|
||||
@ -1214,7 +1211,7 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper, RobotTask
|
||||
robotCommonTaskService.sendChargeTaskToRobot(distribution, robotChargeLogs);
|
||||
}
|
||||
|
||||
}
|
||||
}*/
|
||||
|
||||
/**
|
||||
* 机器人完成充电
|
||||
|
@ -7,10 +7,7 @@ import org.apache.commons.lang3.tuple.Pair;
|
||||
import java.util.List;
|
||||
|
||||
public interface DistributeTasksService {
|
||||
/**
|
||||
* 下发搬运任务
|
||||
*/
|
||||
void distributeTasks();
|
||||
|
||||
|
||||
/**
|
||||
* 获取待执行的机器人和任务
|
||||
|
@ -97,29 +97,6 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
/**
|
||||
* 下发搬运任务
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void distributeTasks() {
|
||||
|
||||
TenantContextHolder.setTenantId(1L);
|
||||
Pair<List<RobotInformationDO>, List<RobotTaskDetailDO>> robotAndTaskDetails = getRobotAndTaskDetails();
|
||||
List<RobotInformationDO> robots = robotAndTaskDetails.getLeft();
|
||||
if (ObjectUtil.isEmpty(robots)) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<RobotTaskDetailDO> taskDetailDOS = robotAndTaskDetails.getRight();
|
||||
if (ObjectUtil.isEmpty(taskDetailDOS)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// List<RobotTaskDetailDO> cycleTaskDetails = robotTaskMapper.getCycleTaskDetails();
|
||||
//任务下发给机器人
|
||||
distributeTasks(robots, taskDetailDOS);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取待执行的机器人和任务
|
||||
@ -295,558 +272,9 @@ public class DistributeTasksServiceImpl implements DistributeTasksService {
|
||||
return robotTaskDetailMapper.getUnDoTaskDetail(montageTaskIds, singleTaskIds);
|
||||
}
|
||||
|
||||
/**
|
||||
* 下发任务给机器人
|
||||
*
|
||||
* @param robots
|
||||
* @param taskDetailDOS
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void distributeTasks(List<RobotInformationDO> robots, List<RobotTaskDetailDO> taskDetailDOS) {
|
||||
List<RobotAcceptTaskDTO> robotTaskDOS = new ArrayList<>();
|
||||
//需要更新的任务明细id
|
||||
List<RobotTaskDetailDO> updateTaskDetails = new ArrayList<>();
|
||||
//需要更新的任务id
|
||||
Set<Long> taskIds = new HashSet<>();
|
||||
//需要更新的机器人编号
|
||||
Set<String> robotNos = new HashSet<>();
|
||||
//当前需要移动的库位id
|
||||
Set<Long> doingLocationIds = new HashSet<>();
|
||||
for (RobotTaskDetailDO taskDetailDO : taskDetailDOS) {
|
||||
if (ObjectUtil.isEmpty(robots)) {
|
||||
break;
|
||||
}
|
||||
// todo 后续建个移库记录表, 记录 库位A移动到库位B
|
||||
RobotTaskTypeEnum robotTaskType = RobotTaskTypeEnum.getRobotTaskType(taskDetailDO.getTaskType());
|
||||
switch (robotTaskType) {
|
||||
case TAKE_RELEASE:
|
||||
doTakeReleaseDistribute(taskDetailDO, robots, robotTaskDOS, taskIds, updateTaskDetails, robotNos, doingLocationIds);
|
||||
break;
|
||||
/*case PARK:
|
||||
doParkDistribute(taskDetailDO, robots,robotTaskDOS);
|
||||
break;
|
||||
case CHARGE:
|
||||
doChargeDistribute(taskDetailDO,robots,robotTaskDOS);
|
||||
break;
|
||||
case MOVE:
|
||||
doMoveDistribute(taskDetailDO, robots,robotTaskDOS);
|
||||
break;
|
||||
case TAKE:
|
||||
doTakeDistribute(taskDetailDO, robots,robotTaskDOS);
|
||||
break;
|
||||
case RELEASE:
|
||||
doReleaseDistribute(taskDetailDO, robots,robotTaskDOS);
|
||||
break;
|
||||
case SCAN:
|
||||
doScanDistribute(taskDetailDO,robots,robotTaskDOS);
|
||||
break;
|
||||
case DETECTING_TRAYS:
|
||||
doDetectingTraysDistribute(taskDetailDO,robots,robotTaskDOS);
|
||||
break;*/
|
||||
default:
|
||||
log.error("下发任务的类型不存在");
|
||||
}
|
||||
}
|
||||
|
||||
if (ObjectUtil.isNotEmpty(robotTaskDOS)) {
|
||||
log.info("任务下发给车机 :{}", JSON.toJSONString(robotTaskDOS));
|
||||
robotTaskApi.sendTaskToRobot(robotTaskDOS);
|
||||
}
|
||||
|
||||
if (ObjectUtil.isNotEmpty(taskIds)) {
|
||||
List<RobotTaskDO> taskDOS = robotTaskMapper.selectBatchIds(taskIds);
|
||||
for (RobotTaskDO taskDO : taskDOS) {
|
||||
if (RobotTaskStatusEnum.NEW.getType().equals(taskDO.getTaskStatus())) {
|
||||
taskDO.setTaskStatus(RobotTaskStatusEnum.DOING.getType());
|
||||
taskDO.setStartTime(LocalDateTime.now());
|
||||
}
|
||||
}
|
||||
robotTaskMapper.updateBatch(taskDOS);
|
||||
}
|
||||
if (ObjectUtil.isNotEmpty(updateTaskDetails)) {
|
||||
robotTaskDetailMapper.updateBatch(updateTaskDetails);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检测托盘类型
|
||||
*
|
||||
* @param taskDetailDO
|
||||
* @param robots
|
||||
* @param robotTaskDOS
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doDetectingTraysDistribute(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
|
||||
List<RobotAcceptTaskDTO> robotTaskDOS) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 扫描码
|
||||
*
|
||||
* @param taskDetailDO
|
||||
* @param robots
|
||||
* @param robotTaskDOS
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doScanDistribute(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
|
||||
List<RobotAcceptTaskDTO> robotTaskDOS) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 仅放货
|
||||
*
|
||||
* @param taskDetailDO
|
||||
* @param robots
|
||||
* @param robotTaskDOS
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doReleaseDistribute(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
|
||||
List<RobotAcceptTaskDTO> robotTaskDOS) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 取放货
|
||||
*
|
||||
* @param taskDetailDO
|
||||
* @param robots
|
||||
* @param robotTaskDOS
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doTakeDistribute(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
|
||||
List<RobotAcceptTaskDTO> robotTaskDOS) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 移动
|
||||
*
|
||||
* @param taskDetailDO
|
||||
* @param robots
|
||||
* @param robotTaskDOS
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doMoveDistribute(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
|
||||
List<RobotAcceptTaskDTO> robotTaskDOS) {
|
||||
String macAddress = "";
|
||||
String robotNo = taskDetailDO.getRobotNo();
|
||||
if (ObjectUtil.isNotEmpty(taskDetailDO.getRobotNo())) {
|
||||
macAddress = robots.stream()
|
||||
.filter(v -> v.getRobotNo().equals(taskDetailDO.getRobotNo()))
|
||||
.map(RobotInformationDO::getMacAddress)
|
||||
.findFirst()
|
||||
.orElse("");
|
||||
if (ObjectUtil.isEmpty(macAddress)) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
macAddress = robots.get(0).getMacAddress();
|
||||
robotNo = robots.get(0).getRobotNo();
|
||||
}
|
||||
|
||||
RobotAcceptTaskDTO robotTaskDO = new RobotAcceptTaskDTO();
|
||||
robotTaskDO.setOrder_id(taskDetailDO.getId().toString());
|
||||
robotTaskDO.setOrder_type("出库");//未定
|
||||
robotTaskDO.setTopic(RobotTopicConstant.ROBOT_TASK_TOPIC + macAddress);
|
||||
|
||||
//1
|
||||
RobotAcceptTaskData taskOne = new RobotAcceptTaskData();
|
||||
taskOne.setSerial("1");
|
||||
taskOne.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskOne.setCommand_type(CommandTypeEnum.MOVE_POSES.getType());
|
||||
|
||||
List<Pose2ds> pose2ds = new ArrayList<>();
|
||||
Pose2ds pose2d1 = new Pose2ds();
|
||||
pose2d1.setX(-1.305);
|
||||
pose2d1.setY(-0.553);
|
||||
pose2d1.setYaw(0.091);
|
||||
Pose2ds pose2d2 = new Pose2ds();
|
||||
pose2d2.setX(-0.407);
|
||||
pose2d2.setY(-0.566);
|
||||
pose2d2.setYaw(0.117);
|
||||
pose2ds.add(pose2d1);
|
||||
pose2ds.add(pose2d2);
|
||||
|
||||
// taskOne.setPose2ds(pose2ds);
|
||||
|
||||
List<RobotAcceptTaskData> data = new ArrayList<>();
|
||||
data.add(taskOne);
|
||||
|
||||
robotTaskDO.setData(data);
|
||||
robotTaskDOS.add(robotTaskDO);
|
||||
|
||||
updateTaskStatus(robotNo, taskDetailDO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 充电
|
||||
*
|
||||
* @param taskDetailDO
|
||||
* @param robots
|
||||
* @param robotTaskDOS
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doChargeDistribute(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
|
||||
List<RobotAcceptTaskDTO> robotTaskDOS) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 停车
|
||||
*
|
||||
* @param taskDetailDO
|
||||
* @param robots
|
||||
* @param robotTaskDOS
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doParkDistribute(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
|
||||
List<RobotAcceptTaskDTO> robotTaskDOS) {
|
||||
String macAddress = "";
|
||||
String robotNo = taskDetailDO.getRobotNo();
|
||||
if (ObjectUtil.isNotEmpty(taskDetailDO.getRobotNo())) {
|
||||
macAddress = robots.stream()
|
||||
.filter(v -> v.getRobotNo().equals(taskDetailDO.getRobotNo()))
|
||||
.map(RobotInformationDO::getMacAddress)
|
||||
.findFirst()
|
||||
.orElse("");
|
||||
if (ObjectUtil.isEmpty(macAddress)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
RobotAcceptTaskDTO robotTaskDO = new RobotAcceptTaskDTO();
|
||||
robotTaskDO.setOrder_id(taskDetailDO.getId().toString());
|
||||
robotTaskDO.setOrder_type("出库");//未定
|
||||
robotTaskDO.setTopic(RobotTopicConstant.ROBOT_TASK_TOPIC + macAddress);
|
||||
|
||||
RobotAcceptTaskData taskOne = new RobotAcceptTaskData();
|
||||
taskOne.setSerial("1");
|
||||
taskOne.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskOne.setCommand_type(CommandTypeEnum.STOP.getType());
|
||||
|
||||
List<RobotAcceptTaskData> data = new ArrayList<>();
|
||||
data.add(taskOne);
|
||||
|
||||
robotTaskDO.setData(data);
|
||||
robotTaskDOS.add(robotTaskDO);
|
||||
|
||||
final String mac = macAddress;
|
||||
robots.removeIf(v -> v.getMacAddress().equals(mac));
|
||||
|
||||
updateTaskStatus(robotNo, taskDetailDO);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 取放货
|
||||
*
|
||||
* @param taskDetailDO
|
||||
* @param robots
|
||||
* @param robotTaskDOS
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doTakeReleaseDistribute(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
|
||||
List<RobotAcceptTaskDTO> robotTaskDOS, Set<Long> taskIdSet,
|
||||
List<RobotTaskDetailDO> updateTaskDetail, Set<String> robotNos
|
||||
, Set<Long> doingLocationIds) {
|
||||
WareHouseLocationDO query = WareHouseLocationDO.builder().id(taskDetailDO.getFromLocationId()).build();
|
||||
WareHouseLocationDO fromLocation = locationMapper.queryAllByLimit(query);
|
||||
|
||||
WareHouseLocationDO toQuery = WareHouseLocationDO.builder().id(taskDetailDO.getToLocationId()).build();
|
||||
WareHouseLocationDO toLocation = locationMapper.queryAllByLimit(toQuery);
|
||||
|
||||
Pair<String, String> pair = getMadAddressRobotNo(taskDetailDO, robots, fromLocation, toLocation);
|
||||
String macAddress = pair.getLeft();
|
||||
String robotNo = pair.getRight();
|
||||
|
||||
if (ObjectUtil.isEmpty(macAddress) || ObjectUtil.isEmpty(robotNo)) {
|
||||
log.info("mac地址为空 :{}, 机器人编号 :{}", macAddress, robotNo);
|
||||
return;
|
||||
}
|
||||
|
||||
// 取货/放货 校验有没有其他库位挡住
|
||||
Boolean fromCanMove = checkCanMove(fromLocation, doingLocationIds);
|
||||
if (!fromCanMove) {
|
||||
return;
|
||||
}
|
||||
Boolean toCanMove = checkCanMove(toLocation, doingLocationIds);
|
||||
if (!toCanMove) {
|
||||
return;
|
||||
}
|
||||
|
||||
RobotAcceptTaskDTO robotTaskDO = new RobotAcceptTaskDTO();
|
||||
robotTaskDO.setOrder_id(taskDetailDO.getId().toString());
|
||||
robotTaskDO.setOrder_type("出库");//未定
|
||||
robotTaskDO.setTopic(RobotTopicConstant.ROBOT_TASK_TOPIC + macAddress);
|
||||
|
||||
//1
|
||||
RobotAcceptTaskData taskOne = new RobotAcceptTaskData();
|
||||
taskOne.setSerial("1");
|
||||
taskOne.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskOne.setCommand_type(CommandTypeEnum.MOVE_POSES.getType());
|
||||
|
||||
List<Pose2ds> pose2ds = new ArrayList<>();
|
||||
Pose2ds pose2 = positionMapItemMapper.selectByLocationId(taskDetailDO.getFromLocationId());
|
||||
pose2ds.add(pose2);
|
||||
// taskOne.setPose2ds(pose2ds);
|
||||
|
||||
//2
|
||||
RobotAcceptTaskData taskTwo = new RobotAcceptTaskData();
|
||||
taskTwo.setSerial("1");
|
||||
taskTwo.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskTwo.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
// taskTwo.setTarget_height(initHeight);
|
||||
|
||||
//3
|
||||
RobotAcceptTaskData taskThree = new RobotAcceptTaskData();
|
||||
taskThree.setSerial("2");
|
||||
taskThree.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskThree.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
// taskThree.setTarget_height(scanHeight);
|
||||
|
||||
//4
|
||||
RobotAcceptTaskData taskFour = new RobotAcceptTaskData();
|
||||
taskFour.setSerial("3");
|
||||
taskFour.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskFour.setCommand_type(CommandTypeEnum.WAIT.getType());
|
||||
// taskFour.setParm(parm);
|
||||
|
||||
//5
|
||||
RobotAcceptTaskData taskFive = new RobotAcceptTaskData();
|
||||
taskFive.setSerial("4");
|
||||
taskFive.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskFive.setCommand_type(CommandTypeEnum.GET_PALLET_TOPIC.getType());
|
||||
|
||||
//6
|
||||
RobotAcceptTaskData taskSix = new RobotAcceptTaskData();
|
||||
taskSix.setSerial("5");
|
||||
taskSix.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskSix.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
|
||||
|
||||
double fromLocationTotalHeight = fromLocation.getLocationTotalHeight().doubleValue();
|
||||
// taskSix.setTarget_height(fromLocationTotalHeight);
|
||||
|
||||
//7
|
||||
RobotAcceptTaskData taskSeven = new RobotAcceptTaskData();
|
||||
taskSeven.setSerial("6");
|
||||
taskSeven.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskSeven.setCommand_type(CommandTypeEnum.MOVE_TO_PALLET_POSE.getType());
|
||||
|
||||
|
||||
//8
|
||||
RobotAcceptTaskData taskEigth = new RobotAcceptTaskData();
|
||||
taskEigth.setSerial("7");
|
||||
taskEigth.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskEigth.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
BigDecimal b1 = new BigDecimal(Double.toString(fromLocationTotalHeight));
|
||||
BigDecimal b2 = new BigDecimal(Double.toString(liftHeight));
|
||||
// taskEigth.setTarget_height(b1.add(b2).doubleValue());
|
||||
|
||||
|
||||
//8-2
|
||||
RobotAcceptTaskData taskEigth2 = new RobotAcceptTaskData();
|
||||
taskEigth2.setSerial("8");
|
||||
taskEigth2.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskEigth2.setCommand_type(CommandTypeEnum.MOVE_POSE.getType());
|
||||
Pose2ds poseWait1 = positionMapItemMapper.selectByLocationId(100l);
|
||||
// taskEigth2.setPose2d(poseWait1);
|
||||
|
||||
//9
|
||||
RobotAcceptTaskData taskNigth = new RobotAcceptTaskData();
|
||||
taskNigth.setSerial("9");
|
||||
taskNigth.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskNigth.setCommand_type(CommandTypeEnum.MOVE_POSES.getType());
|
||||
List<Pose2ds> pose2dsNight = new ArrayList<>();
|
||||
|
||||
/* WareHouseLocationDO ware = WareHouseLocationDO.builder()
|
||||
.laneId(-2l)
|
||||
.build();
|
||||
List<WareHouseLocationDO> releaseStockList =
|
||||
locationMapper.selectLocations(ware, new ArrayList<>(), new HashSet<>());
|
||||
for (WareHouseLocationDO wareHouseLocationDO : releaseStockList) {
|
||||
Pose2ds pose = positionMapItemMapper.selectByLocationId(wareHouseLocationDO.getId());
|
||||
pose2dsNight.add(pose);
|
||||
}*/
|
||||
|
||||
|
||||
// taskNigth.setPose2ds(pose2dsNight);
|
||||
|
||||
//10
|
||||
RobotAcceptTaskData taskTen = new RobotAcceptTaskData();
|
||||
taskTen.setSerial("9");
|
||||
taskTen.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskTen.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
// taskTen.setTarget_height(moveHeight);
|
||||
|
||||
//11
|
||||
RobotAcceptTaskData taskEleven = new RobotAcceptTaskData();
|
||||
taskEleven.setSerial("10");
|
||||
taskEleven.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskEleven.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
|
||||
double toLocationTotalHeight = toLocation.getLocationTotalHeight().doubleValue();
|
||||
BigDecimal b3 = new BigDecimal(Double.toString(toLocationTotalHeight));
|
||||
BigDecimal b4 = new BigDecimal(Double.toString(liftHeight));
|
||||
// taskEleven.setTarget_height(b3.add(b4).doubleValue());
|
||||
|
||||
//12
|
||||
RobotAcceptTaskData taskTwelve = new RobotAcceptTaskData();
|
||||
taskTwelve.setSerial("11");
|
||||
taskTwelve.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskTwelve.setCommand_type(CommandTypeEnum.MOVE_POSE.getType());
|
||||
Pose2ds poseEnd = positionMapItemMapper.selectByLocationId(taskDetailDO.getToLocationId());
|
||||
// taskTwelve.setPose2d(poseEnd);
|
||||
|
||||
//13
|
||||
RobotAcceptTaskData taskThirteen = new RobotAcceptTaskData();
|
||||
taskThirteen.setSerial("12");
|
||||
taskThirteen.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskThirteen.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
// taskThirteen.setTarget_height(toLocationTotalHeight);
|
||||
|
||||
//14
|
||||
RobotAcceptTaskData taskFourteen = new RobotAcceptTaskData();
|
||||
taskFourteen.setSerial("13");
|
||||
taskFourteen.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskFourteen.setCommand_type(CommandTypeEnum.MOVE_POSE.getType());
|
||||
Pose2ds poseWait = positionMapItemMapper.selectByLocationId(99l);
|
||||
// taskFourteen.setPose2d(poseWait);
|
||||
/*
|
||||
Pose2ds poseWait = new Pose2ds();
|
||||
poseWait.setX(3.046);
|
||||
poseWait.setY(3.219);
|
||||
poseWait.setYaw(-3.141);
|
||||
taskFourteen.setPose2d(poseWait);*/
|
||||
|
||||
//15
|
||||
RobotAcceptTaskData taskFifteen = new RobotAcceptTaskData();
|
||||
taskFifteen.setSerial("14");
|
||||
taskFifteen.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskFifteen.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
// taskFifteen.setTarget_height(initHeight);
|
||||
|
||||
List<RobotAcceptTaskData> data = new ArrayList<>();
|
||||
data.add(taskOne);
|
||||
data.add(taskTwo);
|
||||
data.add(taskThree);
|
||||
data.add(taskFour);
|
||||
data.add(taskFive);
|
||||
data.add(taskSix);
|
||||
data.add(taskSeven);
|
||||
data.add(taskEigth);
|
||||
data.add(taskEigth2);
|
||||
data.add(taskNigth);
|
||||
data.add(taskTen);
|
||||
data.add(taskEleven);
|
||||
data.add(taskTwelve);
|
||||
data.add(taskThirteen);
|
||||
data.add(taskFourteen);
|
||||
data.add(taskFifteen);
|
||||
|
||||
|
||||
robotTaskDO.setData(data);
|
||||
|
||||
robotTaskDOS.add(robotTaskDO);
|
||||
|
||||
final String mac = macAddress;
|
||||
robots.removeIf(v -> v.getMacAddress().equals(mac));
|
||||
|
||||
taskDetailDO.setRobotNo(robotNo);
|
||||
taskDetailDO.setStartTime(LocalDateTime.now());
|
||||
taskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType());
|
||||
updateTaskDetail.add(taskDetailDO);
|
||||
|
||||
robotNos.add(robotNo);
|
||||
taskIdSet.add(taskDetailDO.getRobotTaskId());
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验当前库位能否取放
|
||||
*
|
||||
* @param fromLocation
|
||||
* @return false : 有货,不能移动 ; true: 没货, 能移动
|
||||
*/
|
||||
private Boolean checkCanMove(WareHouseLocationDO fromLocation, Set<Long> locationIds) {
|
||||
Long laneId = fromLocation.getLaneId();
|
||||
if (ObjectUtil.isEmpty(laneId)) {
|
||||
Set<Long> doingLocationIds = new HashSet<>();
|
||||
doingLocationIds.add(fromLocation.getId());
|
||||
List<WareHouseLocationDO> locationDOS = locationMapper.selectNeedMoveLocation(doingLocationIds);
|
||||
locationDOS = locationDOS.stream()
|
||||
.filter(v -> !locationIds.contains(v.getId()))
|
||||
.collect(Collectors.toList());
|
||||
if (ObjectUtil.isNotEmpty(locationDOS)) {
|
||||
// todo 后续记录到异常表
|
||||
log.info("普通库位--库位上有其他货物, 库位号:{} ,无法进行移动 :{}", fromLocation.getLocationNo(), locationDOS);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
List<WareHouseLocationDO> locations = new ArrayList<>();
|
||||
WareHouseLocationDO location = WareHouseLocationDO.builder().locationNumber(fromLocation.getLocationNumber())
|
||||
.locationUseStatus(LocationUseStatusEnum.YES.getType())
|
||||
.laneId(fromLocation.getLaneId()).build();
|
||||
locations.add(location);
|
||||
|
||||
List<WareHouseLocationDO> wareHouseLocationDOS = locationMapper.selectLocationByList(locations);
|
||||
wareHouseLocationDOS = wareHouseLocationDOS.stream()
|
||||
.filter(v -> !locationIds.contains(v.getId()))
|
||||
.collect(Collectors.toList());
|
||||
if (ObjectUtil.isNotEmpty(wareHouseLocationDOS)) {
|
||||
// todo 后续记录到异常表
|
||||
log.info("线库-当前库位上有其他货物, 库位号:{},无法进行移动 :{}", fromLocation.getLocationNo(), wareHouseLocationDOS);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
locationIds.add(fromLocation.getId());
|
||||
return true;
|
||||
}
|
||||
|
||||
public Pair<String, String> getMadAddressRobotNo(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
|
||||
WareHouseLocationDO fromLocation, WareHouseLocationDO toLocation) {
|
||||
String macAddress = "";
|
||||
String robotNo = taskDetailDO.getRobotNo();
|
||||
if (ObjectUtil.isNotEmpty(robotNo)) {
|
||||
macAddress = robots.stream()
|
||||
.filter(v -> v.getRobotNo().equals(taskDetailDO.getRobotNo()))
|
||||
.map(RobotInformationDO::getMacAddress)
|
||||
.findFirst()
|
||||
.orElse("");
|
||||
} else {
|
||||
RobotInformationDO robotInformationDO = robots.stream()
|
||||
.filter(v ->
|
||||
ObjectUtil.isNotEmpty(v.getMacAddress())
|
||||
&& v.getFloorAreaJson().contains(fromLocation.getMapId())
|
||||
&& v.getFloorAreaJson().contains(toLocation.getMapId()))
|
||||
.findFirst()
|
||||
.orElse(new RobotInformationDO());
|
||||
macAddress = robotInformationDO.getMacAddress();
|
||||
robotNo = robotInformationDO.getRobotNo();
|
||||
}
|
||||
Pair<String, String> pair = new ImmutablePair<>(macAddress, robotNo);
|
||||
return pair;
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void updateTaskStatus(String robotNo, RobotTaskDetailDO taskDetailDO) {
|
||||
|
||||
RobotTaskDO robotTaskDO = new RobotTaskDO();
|
||||
robotTaskDO.setId(taskDetailDO.getRobotTaskId());
|
||||
robotTaskDO.setStartTime(LocalDateTime.now());
|
||||
robotTaskDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType());
|
||||
robotTaskMapper.updateRobot(robotTaskDO);
|
||||
|
||||
RobotTaskDetailDO detailDO = new RobotTaskDetailDO();
|
||||
detailDO.setId(taskDetailDO.getId());
|
||||
detailDO.setStartTime(LocalDateTime.now());
|
||||
detailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType());
|
||||
robotTaskDetailMapper.updateRobotDetailById(detailDO);
|
||||
|
||||
robotInformationMapper.updateRobotStatus(robotNo, RobotStatusEnum.DOING.getType());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
/*
|
||||
package cn.iocoder.yudao.module.system.service.robot.job;
|
||||
|
||||
import cn.iocoder.yudao.module.system.controller.admin.robot.task.TaskPPDistribution;
|
||||
@ -6,21 +7,28 @@ import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotChargeLogDO;
|
||||
import java.util.List;
|
||||
|
||||
public interface RobotCommonTaskService {
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 让机器人自动充电
|
||||
* @param robotNo
|
||||
*/
|
||||
*//*
|
||||
|
||||
public void startAutoCharge(String robotNo) ;
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 组装任务下发给车机
|
||||
* @param list
|
||||
*/
|
||||
*//*
|
||||
|
||||
void sendTaskToRobot(TaskPPDistribution taskPPDistribution);
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 发送充电任务给车机
|
||||
* @param chargeList
|
||||
*/
|
||||
*//*
|
||||
|
||||
void sendChargeTaskToRobot(TaskPPDistribution chargeList,RobotChargeLogDO robotChargeLogs);
|
||||
}
|
||||
*/
|
||||
|
@ -1,3 +1,4 @@
|
||||
/*
|
||||
package cn.iocoder.yudao.module.system.service.robot.job;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
@ -114,11 +115,13 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
|
||||
private static String SERIAL_KEY = "SERIAL_KEY";
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 让机器人自动充电
|
||||
*
|
||||
* @param robotNo
|
||||
*/
|
||||
*//*
|
||||
|
||||
@Override
|
||||
@Async(NOTIFY_THREAD_POOL_TASK_EXECUTOR)
|
||||
public void startAutoCharge(String robotNo) {
|
||||
@ -127,10 +130,12 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 客户下发的任务
|
||||
*
|
||||
*/
|
||||
*//*
|
||||
|
||||
@Override
|
||||
@Async(NOTIFY_THREAD_POOL_TASK_EXECUTOR)
|
||||
public void sendTaskToRobot(TaskPPDistribution v) {
|
||||
@ -183,14 +188,16 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
taskDetailActionLogService.addLogInCache(logs);
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 仅放货
|
||||
*
|
||||
* @param v
|
||||
* @param robotTaskDetailDO
|
||||
* @param locationMap
|
||||
* @return
|
||||
*/
|
||||
*//*
|
||||
|
||||
private Pair<List<RobotAcceptTaskData>, List<RobotTaskDetailActionLogDO>> releaseTask(TaskPPDistribution v,
|
||||
RobotTaskDetailDO robotTaskDetailDO,
|
||||
Map<Long, WareHouseLocationDO> locationMap) {
|
||||
@ -231,14 +238,16 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
return pair;
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 仅取货任务
|
||||
*
|
||||
* @param v
|
||||
* @param robotTaskDetailDO
|
||||
* @param locationMap
|
||||
* @return
|
||||
*/
|
||||
*//*
|
||||
|
||||
private Pair<List<RobotAcceptTaskData>, List<RobotTaskDetailActionLogDO>> takeTask(TaskPPDistribution v, RobotTaskDetailDO robotTaskDetailDO,
|
||||
Map<Long, WareHouseLocationDO> locationMap) {
|
||||
|
||||
@ -293,14 +302,16 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
return pair;
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 移动的任务、充电任务
|
||||
*
|
||||
* @param v
|
||||
* @param robotTaskDetailDO
|
||||
* @param locationMap
|
||||
* @return
|
||||
*/
|
||||
*//*
|
||||
|
||||
private Pair<List<RobotAcceptTaskData>, List<RobotTaskDetailActionLogDO>> moveTask(TaskPPDistribution v,
|
||||
RobotTaskDetailDO robotTaskDetailDO,
|
||||
Map<Long, WareHouseLocationDO> locationMap) {
|
||||
@ -322,12 +333,14 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
return pair;
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 仅放货、移动
|
||||
*
|
||||
* @param logOne
|
||||
* @param v
|
||||
*/
|
||||
*//*
|
||||
|
||||
private RobotAcceptTaskData onlyMove(RobotTaskDetailActionLogDO logOne, TaskPPDistribution v,
|
||||
String msg,Map<String,Integer> serialMap) {
|
||||
logOne.setCommandId(getId());
|
||||
@ -350,13 +363,15 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
return robotAcceptTaskData;
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 取放
|
||||
*
|
||||
* @param v
|
||||
* @param robotTaskDetailDO
|
||||
* @return
|
||||
*/
|
||||
*//*
|
||||
|
||||
private Pair<List<RobotAcceptTaskData>, List<RobotTaskDetailActionLogDO>> takeReleaseTask(TaskPPDistribution v, RobotTaskDetailDO robotTaskDetailDO,
|
||||
Map<Long, WareHouseLocationDO> locationMap) {
|
||||
|
||||
@ -454,14 +469,16 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 行走--放
|
||||
*
|
||||
* @param logNight
|
||||
* @param v
|
||||
* @param robotTaskDetailDO
|
||||
* @return
|
||||
*/
|
||||
*//*
|
||||
|
||||
private RobotAcceptTaskData getToMovePose(RobotTaskDetailActionLogDO logNight, TaskPPDistribution v,
|
||||
RobotTaskDetailDO robotTaskDetailDO,Map<String,Integer> serialMap) {
|
||||
List<TaskPathPlanningDTO> releases = v.getReleases();
|
||||
@ -486,7 +503,8 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
return robotAcceptTaskData;
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 移动到最后一个点位
|
||||
*
|
||||
* @param logEight
|
||||
@ -494,7 +512,8 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
* @param robotTaskDetailDO
|
||||
* @param locationMap
|
||||
* @return
|
||||
*/
|
||||
*//*
|
||||
|
||||
private RobotAcceptTaskData getMovePose(RobotTaskDetailActionLogDO logEight, TaskPPDistribution v,
|
||||
RobotTaskDetailDO robotTaskDetailDO, Map<Long, WareHouseLocationDO> locationMap,
|
||||
Boolean isTake, String msg,Map<String,Integer> serialMap) {
|
||||
@ -523,14 +542,16 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
return robotAcceptTaskData;
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 移动到取货终点
|
||||
*
|
||||
* @param logSix
|
||||
* @param v
|
||||
* @param robotTaskDetailDO
|
||||
* @return
|
||||
*/
|
||||
*//*
|
||||
|
||||
private RobotAcceptTaskData moveToPalletPose(RobotTaskDetailActionLogDO logSix, TaskPPDistribution v,
|
||||
RobotTaskDetailDO robotTaskDetailDO, String msg,Map<String,Integer> serialMap) {
|
||||
logSix.setCommandId(getId());
|
||||
@ -546,14 +567,16 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
return robotAcceptTaskData;
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 获取托盘位置
|
||||
*
|
||||
* @param logFour
|
||||
* @param v
|
||||
* @param robotTaskDetailDO
|
||||
* @return
|
||||
*/
|
||||
*//*
|
||||
|
||||
private RobotAcceptTaskData getPalletTopic(RobotTaskDetailActionLogDO logFour, TaskPPDistribution v,
|
||||
RobotTaskDetailDO robotTaskDetailDO,Map<String,Integer> serialMap) {
|
||||
logFour.setCommandId(getId());
|
||||
@ -588,14 +611,16 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
return robotAcceptTaskData;
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 默认取的抬叉
|
||||
*
|
||||
* @param logTwo
|
||||
* @param v
|
||||
* @param robotTaskDetailDO
|
||||
* @return
|
||||
*/
|
||||
*//*
|
||||
|
||||
private RobotAcceptTaskData getTakeFork(RobotTaskDetailActionLogDO logTwo, TaskPPDistribution v,
|
||||
RobotTaskDetailDO robotTaskDetailDO, Boolean isTake,
|
||||
Map<Long, WareHouseLocationDO> locationMap, Double addHeight,
|
||||
@ -675,9 +700,11 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
/**
|
||||
* 充电任务
|
||||
*/
|
||||
*//*
|
||||
|
||||
@Override
|
||||
@Async(NOTIFY_THREAD_POOL_TASK_EXECUTOR)
|
||||
public void sendChargeTaskToRobot(TaskPPDistribution v, RobotChargeLogDO chargeLogDO) {
|
||||
@ -715,3 +742,4 @@ public class RobotCommonTaskServiceImpl implements RobotCommonTaskService {
|
||||
|
||||
|
||||
}
|
||||
*/
|
||||
|
@ -545,299 +545,13 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
|
||||
}
|
||||
}
|
||||
|
||||
public Pair<String, String> getMadAddressRobotNo(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
|
||||
WareHouseLocationDO fromLocation, WareHouseLocationDO toLocation) {
|
||||
String macAddress = "";
|
||||
String robotNo = taskDetailDO.getRobotNo();
|
||||
if (ObjectUtil.isNotEmpty(robotNo)) {
|
||||
macAddress = robots.stream()
|
||||
.filter(v -> v.getRobotNo().equals(taskDetailDO.getRobotNo()))
|
||||
.map(RobotInformationDO::getMacAddress)
|
||||
.findFirst()
|
||||
.orElse("");
|
||||
} else {
|
||||
RobotInformationDO robotInformationDO = robots.stream()
|
||||
.filter(v ->
|
||||
ObjectUtil.isNotEmpty(v.getMacAddress())
|
||||
&& v.getFloorAreaJson().contains(fromLocation.getMapId())
|
||||
&& v.getFloorAreaJson().contains(toLocation.getMapId()))
|
||||
.findFirst()
|
||||
.orElse(new RobotInformationDO());
|
||||
macAddress = robotInformationDO.getMacAddress();
|
||||
robotNo = robotInformationDO.getRobotNo();
|
||||
}
|
||||
Pair<String, String> pair = new ImmutablePair<>(macAddress, robotNo);
|
||||
return pair;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 取放货
|
||||
*
|
||||
* @param taskDetailDO
|
||||
* @param robots
|
||||
* @param robotTaskDOS
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void doTakeReleaseDistribute(RobotTaskDetailDO taskDetailDO, List<RobotInformationDO> robots,
|
||||
List<RobotAcceptTaskDTO> robotTaskDOS, Set<Long> taskIdSet,
|
||||
List<RobotTaskDetailDO> updateTaskDetail, Set<String> robotNos,
|
||||
Set<Long> doingLocationIds, Map<Long, WareHouseLocationDO> locationMp,
|
||||
List<TaskToPathPlanningDTO> taskToPathPlanningDTOS) {
|
||||
|
||||
WareHouseLocationDO fromLocation = locationMp.get(taskDetailDO.getFromLocationId());
|
||||
WareHouseLocationDO toLocation = locationMp.get(taskDetailDO.getToLocationId());
|
||||
|
||||
TaskToPathPlanningDTO taskToPathPlanningDTO = new TaskToPathPlanningDTO();
|
||||
|
||||
Pair<String, String> pair = getMadAddressRobotNo(taskDetailDO, robots, fromLocation, toLocation);
|
||||
String macAddress = pair.getLeft();
|
||||
String robotNo = pair.getRight();
|
||||
|
||||
if (ObjectUtil.isEmpty(macAddress) || ObjectUtil.isEmpty(robotNo)) {
|
||||
log.info("mac地址为空 :{}, 机器人编号 :{}", macAddress, robotNo);
|
||||
return;
|
||||
}
|
||||
|
||||
// 取货/放货 校验有没有其他库位挡住
|
||||
Boolean fromCanMove = checkCanMove(fromLocation, doingLocationIds);
|
||||
if (!fromCanMove) {
|
||||
return;
|
||||
}
|
||||
Boolean toCanMove = checkCanMove(toLocation, doingLocationIds);
|
||||
if (!toCanMove) {
|
||||
return;
|
||||
}
|
||||
|
||||
RobotAcceptTaskDTO robotTaskDO = new RobotAcceptTaskDTO();
|
||||
robotTaskDO.setOrder_id(taskDetailDO.getId().toString());
|
||||
robotTaskDO.setOrder_type("出库");//未定
|
||||
robotTaskDO.setTopic(RobotTopicConstant.ROBOT_TASK_TOPIC + macAddress);
|
||||
|
||||
//1
|
||||
RobotAcceptTaskData taskOne = new RobotAcceptTaskData();
|
||||
taskOne.setSerial("1");
|
||||
taskOne.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskOne.setCommand_type(CommandTypeEnum.MOVE_POSES.getType());
|
||||
|
||||
List<Pose2ds> pose2ds = new ArrayList<>();
|
||||
Pose2ds pose2 = positionMapItemMapper.selectByLocationId(taskDetailDO.getFromLocationId());
|
||||
pose2ds.add(pose2);
|
||||
// taskOne.setPose2ds(pose2ds);
|
||||
|
||||
//2
|
||||
RobotAcceptTaskData taskTwo = new RobotAcceptTaskData();
|
||||
taskTwo.setSerial("1");
|
||||
taskTwo.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskTwo.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
// taskTwo.setTarget_height(initHeight);
|
||||
|
||||
//3
|
||||
RobotAcceptTaskData taskThree = new RobotAcceptTaskData();
|
||||
taskThree.setSerial("2");
|
||||
taskThree.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskThree.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
// taskThree.setTarget_height(scanHeight);
|
||||
|
||||
//4
|
||||
RobotAcceptTaskData taskFour = new RobotAcceptTaskData();
|
||||
taskFour.setSerial("3");
|
||||
taskFour.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskFour.setCommand_type(CommandTypeEnum.WAIT.getType());
|
||||
// taskFour.setParm(parm);
|
||||
|
||||
//5
|
||||
RobotAcceptTaskData taskFive = new RobotAcceptTaskData();
|
||||
taskFive.setSerial("4");
|
||||
taskFive.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskFive.setCommand_type(CommandTypeEnum.GET_PALLET_TOPIC.getType());
|
||||
|
||||
//6
|
||||
RobotAcceptTaskData taskSix = new RobotAcceptTaskData();
|
||||
taskSix.setSerial("5");
|
||||
taskSix.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskSix.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
|
||||
|
||||
double fromLocationTotalHeight = fromLocation.getLocationTotalHeight().doubleValue();
|
||||
// taskSix.setTarget_height(fromLocationTotalHeight);
|
||||
|
||||
//7
|
||||
RobotAcceptTaskData taskSeven = new RobotAcceptTaskData();
|
||||
taskSeven.setSerial("6");
|
||||
taskSeven.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskSeven.setCommand_type(CommandTypeEnum.MOVE_TO_PALLET_POSE.getType());
|
||||
|
||||
|
||||
//8
|
||||
RobotAcceptTaskData taskEigth = new RobotAcceptTaskData();
|
||||
taskEigth.setSerial("7");
|
||||
taskEigth.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskEigth.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
BigDecimal b1 = new BigDecimal(Double.toString(fromLocationTotalHeight));
|
||||
BigDecimal b2 = new BigDecimal(Double.toString(liftHeight));
|
||||
// taskEigth.setTarget_height(b1.add(b2).doubleValue());
|
||||
|
||||
|
||||
//8-2
|
||||
RobotAcceptTaskData taskEigth2 = new RobotAcceptTaskData();
|
||||
taskEigth2.setSerial("8");
|
||||
taskEigth2.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskEigth2.setCommand_type(CommandTypeEnum.MOVE_POSE.getType());
|
||||
Pose2ds poseWait1 = positionMapItemMapper.selectByLocationId(100l);
|
||||
// taskEigth2.setPose2d(poseWait1);
|
||||
|
||||
//9
|
||||
RobotAcceptTaskData taskNigth = new RobotAcceptTaskData();
|
||||
taskNigth.setSerial("9");
|
||||
taskNigth.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskNigth.setCommand_type(CommandTypeEnum.MOVE_POSES.getType());
|
||||
List<Pose2ds> pose2dsNight = new ArrayList<>();
|
||||
|
||||
/*WareHouseLocationDO ware = WareHouseLocationDO.builder()
|
||||
.laneId(-2l)
|
||||
.build();
|
||||
List<WareHouseLocationDO> releaseStockList =
|
||||
locationMapper.selectLocations(ware, new ArrayList<>(), new HashSet<>());
|
||||
for (WareHouseLocationDO wareHouseLocationDO : releaseStockList) {
|
||||
Pose2ds pose = positionMapItemMapper.selectByLocationId(wareHouseLocationDO.getId());
|
||||
pose2dsNight.add(pose);
|
||||
}*/
|
||||
|
||||
|
||||
// taskNigth.setPose2ds(pose2dsNight);
|
||||
|
||||
//10
|
||||
RobotAcceptTaskData taskTen = new RobotAcceptTaskData();
|
||||
taskTen.setSerial("9");
|
||||
taskTen.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskTen.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
// taskTen.setTarget_height(moveHeight);
|
||||
|
||||
//11
|
||||
RobotAcceptTaskData taskEleven = new RobotAcceptTaskData();
|
||||
taskEleven.setSerial("10");
|
||||
taskEleven.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskEleven.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
|
||||
double toLocationTotalHeight = toLocation.getLocationTotalHeight().doubleValue();
|
||||
BigDecimal b3 = new BigDecimal(Double.toString(toLocationTotalHeight));
|
||||
BigDecimal b4 = new BigDecimal(Double.toString(liftHeight));
|
||||
// taskEleven.setTarget_height(b3.add(b4).doubleValue());
|
||||
|
||||
//12
|
||||
RobotAcceptTaskData taskTwelve = new RobotAcceptTaskData();
|
||||
taskTwelve.setSerial("11");
|
||||
taskTwelve.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskTwelve.setCommand_type(CommandTypeEnum.MOVE_POSE.getType());
|
||||
Pose2ds poseEnd = positionMapItemMapper.selectByLocationId(taskDetailDO.getToLocationId());
|
||||
// taskTwelve.setPose2d(poseEnd);
|
||||
|
||||
//13
|
||||
RobotAcceptTaskData taskThirteen = new RobotAcceptTaskData();
|
||||
taskThirteen.setSerial("12");
|
||||
taskThirteen.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskThirteen.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
// taskThirteen.setTarget_height(toLocationTotalHeight);
|
||||
|
||||
//14
|
||||
RobotAcceptTaskData taskFourteen = new RobotAcceptTaskData();
|
||||
taskFourteen.setSerial("13");
|
||||
taskFourteen.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskFourteen.setCommand_type(CommandTypeEnum.MOVE_POSE.getType());
|
||||
Pose2ds poseWait = positionMapItemMapper.selectByLocationId(99l);
|
||||
// taskFourteen.setPose2d(poseWait);
|
||||
/*
|
||||
Pose2ds poseWait = new Pose2ds();
|
||||
poseWait.setX(3.046);
|
||||
poseWait.setY(3.219);
|
||||
poseWait.setYaw(-3.141);
|
||||
taskFourteen.setPose2d(poseWait);*/
|
||||
|
||||
//15
|
||||
RobotAcceptTaskData taskFifteen = new RobotAcceptTaskData();
|
||||
taskFifteen.setSerial("14");
|
||||
taskFifteen.setCommand_id(taskDetailDO.getId().toString());
|
||||
taskFifteen.setCommand_type(CommandTypeEnum.FORK.getType());
|
||||
// taskFifteen.setTarget_height(initHeight);
|
||||
|
||||
List<RobotAcceptTaskData> data = new ArrayList<>();
|
||||
data.add(taskOne);
|
||||
data.add(taskTwo);
|
||||
data.add(taskThree);
|
||||
data.add(taskFour);
|
||||
data.add(taskFive);
|
||||
data.add(taskSix);
|
||||
data.add(taskSeven);
|
||||
data.add(taskEigth);
|
||||
data.add(taskEigth2);
|
||||
data.add(taskNigth);
|
||||
data.add(taskTen);
|
||||
data.add(taskEleven);
|
||||
data.add(taskTwelve);
|
||||
data.add(taskThirteen);
|
||||
data.add(taskFourteen);
|
||||
data.add(taskFifteen);
|
||||
|
||||
|
||||
robotTaskDO.setData(data);
|
||||
|
||||
robotTaskDOS.add(robotTaskDO);
|
||||
|
||||
final String mac = macAddress;
|
||||
robots.removeIf(v -> v.getMacAddress().equals(mac));
|
||||
|
||||
taskDetailDO.setRobotNo(robotNo);
|
||||
taskDetailDO.setStartTime(LocalDateTime.now());
|
||||
taskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType());
|
||||
updateTaskDetail.add(taskDetailDO);
|
||||
|
||||
robotNos.add(robotNo);
|
||||
taskIdSet.add(taskDetailDO.getRobotTaskId());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 校验当前库位能否取放
|
||||
*
|
||||
* @param fromLocation
|
||||
* @return false : 有货,不能移动 ; true: 没货, 能移动
|
||||
*/
|
||||
private Boolean checkCanMove(WareHouseLocationDO fromLocation, Set<Long> locationIds) {
|
||||
Long laneId = fromLocation.getLaneId();
|
||||
if (ObjectUtil.isEmpty(laneId)) {
|
||||
Set<Long> doingLocationIds = new HashSet<>();
|
||||
doingLocationIds.add(fromLocation.getId());
|
||||
List<WareHouseLocationDO> locationDOS = locationMapper.selectNeedMoveLocation(doingLocationIds);
|
||||
locationDOS = locationDOS.stream()
|
||||
.filter(v -> !locationIds.contains(v.getId()))
|
||||
.collect(Collectors.toList());
|
||||
if (ObjectUtil.isNotEmpty(locationDOS)) {
|
||||
// todo 后续记录到异常表
|
||||
log.info("普通库位--库位上有其他货物, 库位号:{} ,无法进行移动 :{}", fromLocation.getLocationNo(), locationDOS);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
List<WareHouseLocationDO> locations = new ArrayList<>();
|
||||
WareHouseLocationDO location = WareHouseLocationDO.builder().locationNumber(fromLocation.getLocationNumber())
|
||||
.locationUseStatus(LocationUseStatusEnum.YES.getType())
|
||||
.laneId(fromLocation.getLaneId()).build();
|
||||
locations.add(location);
|
||||
|
||||
List<WareHouseLocationDO> wareHouseLocationDOS = locationMapper.selectLocationByList(locations);
|
||||
wareHouseLocationDOS = wareHouseLocationDOS.stream()
|
||||
.filter(v -> !locationIds.contains(v.getId()))
|
||||
.collect(Collectors.toList());
|
||||
if (ObjectUtil.isNotEmpty(wareHouseLocationDOS)) {
|
||||
// todo 后续记录到异常表
|
||||
log.info("线库-当前库位上有其他货物, 库位号:{},无法进行移动 :{}", fromLocation.getLocationNo(), wareHouseLocationDOS);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
locationIds.add(fromLocation.getId());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,6 +1,12 @@
|
||||
package cn.iocoder.yudao.module.system.service.tool;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
|
||||
public interface ToolsService {
|
||||
String sendPPsortConfig();
|
||||
|
||||
String cleanAgv( String agvNo);
|
||||
|
||||
String closeTaskDetail(String taskDetailId);
|
||||
}
|
||||
|
@ -2,20 +2,30 @@ package cn.iocoder.yudao.module.system.service.tool;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
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.task.dto.RobotAcceptTaskDTO;
|
||||
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.constant.path.PathPlanningTopicConstant;
|
||||
import cn.iocoder.yudao.module.system.constant.robot.RobotTopicConstant;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.config.dto.TaskOrderConfigDTO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.config.vo.CommonConfigVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.tool.dto.CleanAgvDTO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.config.CommonConfigDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotWarnMsgDO;
|
||||
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;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
@ -28,7 +38,7 @@ import java.util.Arrays;
|
||||
public class ToolsServiceImpl implements ToolsService {
|
||||
|
||||
@Resource
|
||||
private PathPlanningApi pathPlanningApi;
|
||||
private CommonApi commonApi;
|
||||
|
||||
@Resource
|
||||
private CommonConfigMapper configMapper;
|
||||
@ -39,6 +49,12 @@ public class ToolsServiceImpl implements ToolsService {
|
||||
@Resource
|
||||
private RobotWarnMsgMapper warnMsgMapper;
|
||||
|
||||
@Resource
|
||||
private RobotInformationService informationService;
|
||||
|
||||
@Autowired
|
||||
private RobotInformationService robotInformationService;
|
||||
|
||||
/**
|
||||
* 发送时间、优先级、距离的权重给PP
|
||||
*
|
||||
@ -70,12 +86,50 @@ public class ToolsServiceImpl implements ToolsService {
|
||||
}
|
||||
|
||||
TaskOrderConfigDTO taskOrderConfigDTO = JSONUtil.toBean(config.getConfigStr(), TaskOrderConfigDTO.class);
|
||||
pathPlanningApi.synchronousLineObject(taskOrderConfigDTO,
|
||||
commonApi.commonMethod(taskOrderConfigDTO,
|
||||
PathPlanningTopicConstant.SEND_SORT_CONFIG_TO_PP);
|
||||
|
||||
return "发送数据库权重配置成功";
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除交管
|
||||
*
|
||||
* @param agvNo
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String cleanAgv(String robotNo) {
|
||||
CleanAgvDTO build = CleanAgvDTO.builder().robotNo(robotNo).build();
|
||||
commonApi.commonMethod(build, PathPlanningTopicConstant.CLEAN_AGV);
|
||||
return "清除交管成功 " + robotNo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭任务
|
||||
* @param taskDetailId
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String closeTaskDetail(String taskDetailId) {
|
||||
RobotInformationDO informationDO = informationService.getRobotInformationByDetailId(taskDetailId);
|
||||
RobotClosePathPlantingDTO closePathPlanting = RobotClosePathPlantingDTO.builder()
|
||||
.robotNo(informationDO.getRobotNo())
|
||||
.id(taskDetailId)
|
||||
.build();
|
||||
commonApi.commonMethod(closePathPlanting, PathPlanningTopicConstant.KILL_TASK);
|
||||
|
||||
RobotAcceptTaskDTO robotTask = new RobotAcceptTaskDTO();
|
||||
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());
|
||||
|
||||
return "关闭任务成功";
|
||||
}
|
||||
|
||||
|
||||
public void addWarnMsg() {
|
||||
RobotWarnMsgDO warnMsg = RobotWarnMsgDO.builder().warnLevel(4)
|
||||
@ -90,7 +144,4 @@ public class ToolsServiceImpl implements ToolsService {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user