车辆移动指令

This commit is contained in:
cbs 2025-03-10 16:35:33 +08:00
parent a57374f2c0
commit 908ac015ca
27 changed files with 343 additions and 932 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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,"路径规划失败上报");

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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);
});
}
}

View File

@ -80,5 +80,10 @@ public class PathPlanningTopicConstant {
*/
public static String CLEAN_AGV = "CLEAN_AGV";
/**
* 实时行为上报
*/
public static String UPDATE_ACTION = "UPDATE_ACTION";
}

View File

@ -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";
}

View File

@ -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));
}
}

View File

@ -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;
}

View File

@ -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")

View File

@ -23,4 +23,10 @@ public interface PathPlanningService {
void synchronousItemUpdate(PositionMapItemSaveReqVO positionMapItemSaveReqVO);
void robotDimensions();
/**
* 发送路径给车机
* @param message
*/
void sendPosedsToRobot(String message);
}

View File

@ -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())

View File

@ -131,4 +131,6 @@ public interface RobotInformationService extends IService<RobotInformationDO> {
* @return
*/
List<RobotInformationDO> getListByMapId(Long mapId);
RobotInformationDO getRobotInformationByDetailId(String taskDetailId);
}

View File

@ -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;
}
}

View File

@ -68,7 +68,7 @@ public interface RobotTaskService extends IService<RobotTaskDO> {
* PP分配的任务
* @param message
*/
void ppDistributionTask(String message);
// void ppDistributionTask(String message);
/**
* 任务日志分页

View File

@ -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);
}
}
}*/
/**
* 机器人完成充电

View File

@ -7,10 +7,7 @@ import org.apache.commons.lang3.tuple.Pair;
import java.util.List;
public interface DistributeTasksService {
/**
* 下发搬运任务
*/
void distributeTasks();
/**
* 获取待执行的机器人和任务

View File

@ -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());
}
}

View File

@ -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);
}
*/

View File

@ -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 {
}
*/

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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 {
}
}