PP分配任务
This commit is contained in:
parent
63909d1105
commit
ccf5c1d7b5
@ -137,6 +137,8 @@ public class MqttFactory {
|
||||
return BeanUtils.getBean(RobotStatusServiceImpl.class);
|
||||
case SYNCHRONOUS_ALL_MAP_REQUEST:
|
||||
return BeanUtils.getBean(PathPlanningInitDataServiceImpl.class);
|
||||
case DISTRIBUTION_TASK:
|
||||
return BeanUtils.getBean(PathPlanningDistributionTaskServiceImpl.class);
|
||||
default :
|
||||
// case ROBOT_TASK_STATUS:
|
||||
return BeanUtils.getBean(RobotTaskStatusServiceImpl.class);
|
||||
|
@ -18,7 +18,8 @@ public enum DefineSubTopicEnum {
|
||||
ROBOT_STATUS("ROBOT_STATUS", 0,"点位"),
|
||||
ROBOT_TASK_STATUS("ROBOT_TASK_STATUS", 0,"机器人任务完成上报"),
|
||||
ROBOT_GENERICS_STATUS("ROBOT_GENERICS_STATUS", 0,"机器人异常"),
|
||||
SYNCHRONOUS_ALL_MAP_REQUEST("SYNCHRONOUS_ALL_MAP_REQUEST", 0,"路径规划需要初始数据上报");
|
||||
SYNCHRONOUS_ALL_MAP_REQUEST("SYNCHRONOUS_ALL_MAP_REQUEST", 0,"路径规划需要初始数据上报"),
|
||||
DISTRIBUTION_TASK("DISTRIBUTION_TASK", 0,"路径规划分配上报");
|
||||
|
||||
|
||||
private final String topic;
|
||||
|
@ -0,0 +1,25 @@
|
||||
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;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class PathPlanningDistributionTaskServiceImpl implements MqttService{
|
||||
|
||||
@Resource
|
||||
private PathApi pathApi;
|
||||
|
||||
/**
|
||||
* PP分配任务上报
|
||||
* @param message
|
||||
*/
|
||||
@Override
|
||||
public void analysisMessage(String message) {
|
||||
log.info("PP上报任务分配");
|
||||
pathApi.ppDistributionTask(message);
|
||||
}
|
||||
}
|
@ -16,4 +16,5 @@ public interface PathApi {
|
||||
@Operation(summary = "路径规划需要初始化信息")
|
||||
void pathInitData();
|
||||
|
||||
void ppDistributionTask(String message);
|
||||
}
|
||||
|
@ -1,9 +1,11 @@
|
||||
package cn.iocoder.yudao.module.system.api.path;
|
||||
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.positionmap.vo.PositionMapSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.service.path.PathPlanningService;
|
||||
import cn.iocoder.yudao.module.system.service.robot.RobotTaskService;
|
||||
import cn.iocoder.yudao.module.system.service.tool.ToolsService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
@ -22,10 +24,16 @@ public class PathApiImpl implements PathApi {
|
||||
@Resource
|
||||
private ToolsService toolsService;
|
||||
|
||||
@Resource
|
||||
private RobotTaskService taskService;
|
||||
|
||||
/**
|
||||
* 发送初始化信息给PP
|
||||
*/
|
||||
@Override
|
||||
public void pathInitData() {
|
||||
TenantContextHolder.setTenantId(1L);
|
||||
|
||||
log.info("初始化数据发送个PP---开始");
|
||||
//同步点位信息
|
||||
PositionMapSaveReqVO positionMapSaveReqVO = new PositionMapSaveReqVO();
|
||||
pathPlanningService.synchronousAllItem(positionMapSaveReqVO);
|
||||
@ -35,5 +43,27 @@ public class PathApiImpl implements PathApi {
|
||||
pathPlanningService.robotDimensions();
|
||||
//距离、优先级、时间权重
|
||||
toolsService.sendPPsortConfig();
|
||||
log.info("初始化数据发送个PP---完成");
|
||||
}
|
||||
|
||||
/**
|
||||
* PP分配任务
|
||||
* @param message
|
||||
*/
|
||||
@Override
|
||||
public void ppDistributionTask(String message) {
|
||||
if (ObjectUtil.isEmpty(message)) {
|
||||
return;
|
||||
}
|
||||
taskService.ppDistributionTask(message);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -9,6 +9,11 @@ public class PathPlanningTopicConstant {
|
||||
*/
|
||||
public static String SYNCHRONOUS_ALL_MAP_LINE = "SYNCHRONOUS_ALL_MAP_LINE";
|
||||
|
||||
/**
|
||||
* 同步全部地图点位 ware_position_map_line数据 结束
|
||||
*/
|
||||
public static String SYNCHRONOUS_ALL_MAP_LINE_END = "SYNCHRONOUS_ALL_MAP_LINE_END";
|
||||
|
||||
/**
|
||||
* 同步 ware_position_map_item数据
|
||||
*/
|
||||
|
@ -0,0 +1,26 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.robot.task;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* PP分配的任务
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class TaskPPDistribution {
|
||||
|
||||
@Schema(description = "robot_task_detail/robot_charge_log 的 id")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "任务类型(TASK:robot_task的任务、CHARGE:充电任务)")
|
||||
private String type;
|
||||
|
||||
@Schema(description = "AGV编号")
|
||||
private String robotNo;
|
||||
}
|
@ -48,7 +48,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
@Resource
|
||||
private PositionMapMapper positionMapMapper;
|
||||
|
||||
public static ExecutorService executor = Executors.newFixedThreadPool(5);
|
||||
// public static ExecutorService executor = Executors.newFixedThreadPool(5);
|
||||
|
||||
@Resource
|
||||
private PathPlanningApi pathPlanningApi;
|
||||
@ -66,10 +66,10 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
public void synchronousPoint(PositionMapSaveReqVO data) {
|
||||
|
||||
List<PositionMapDO> positionMapDOS = positionMapMapper.selectList(new LambdaQueryWrapperX<PositionMapDO>()
|
||||
.eq(ObjectUtil.isNotEmpty(data.getFloor()), PositionMapDO::getFloor, data.getFloor())
|
||||
.eq(ObjectUtil.isNotEmpty(data.getArea()), PositionMapDO::getArea, data.getArea()));
|
||||
.eq(ObjectUtil.isNotEmpty(data.getFloor()), PositionMapDO::getFloor, data.getFloor())
|
||||
.eq(ObjectUtil.isNotEmpty(data.getArea()), PositionMapDO::getArea, data.getArea()));
|
||||
|
||||
if (ObjectUtil.isEmpty(positionMapDOS) ) {
|
||||
if (ObjectUtil.isEmpty(positionMapDOS)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@ -77,7 +77,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
List<PositionMapLineDTO> positionLines = positionMapLineMapper.getAllPositionMapLine(positionMapLineDO);
|
||||
|
||||
// List<PositionMapLineDO> positionLines = positionMapLineMapper.selectList(new LambdaQueryWrapperX<PositionMapLineDO>());
|
||||
if ( ObjectUtil.isEmpty(positionLines)) {
|
||||
if (ObjectUtil.isEmpty(positionLines)) {
|
||||
throw exception(PATH_PLANNING_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@ -93,13 +93,15 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
continue;
|
||||
}
|
||||
|
||||
assembleDataToPP(relatedPathNode,positionMapLineDOS);
|
||||
assembleDataToPP(relatedPathNode, positionMapLineDOS);
|
||||
}
|
||||
|
||||
pathPlanningApi.synchronousLineObject("路网同步完成", PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_LINE_END);
|
||||
}
|
||||
|
||||
/**
|
||||
* 同步ware_position_map_item的点位信息
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
@ -130,6 +132,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
|
||||
/**
|
||||
* 添加ware_position_map_line的点位信息
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
@ -173,6 +176,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
|
||||
/**
|
||||
* 删除 ware_position_map_line的点位信息
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
@ -203,6 +207,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
|
||||
/**
|
||||
* 更新ware_position_map_line
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
@ -247,6 +252,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
|
||||
/**
|
||||
* 添加ware_position_map_item
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
@ -286,6 +292,7 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
|
||||
/**
|
||||
* 删除ware_position_map_item
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
@ -382,55 +389,27 @@ public class PathPlanningServiceImpl implements PathPlanningService {
|
||||
|
||||
/**
|
||||
* 组装数据发送到PP
|
||||
*
|
||||
* @param relatedPathNode
|
||||
* @param positionMapLineDOS
|
||||
*/
|
||||
private void assembleDataToPP(PositionMapLinePathDTO relatedPathNode, List<PositionMapLineDTO> positionMapLineDOS) {
|
||||
executor.execute(() -> {
|
||||
List<PositionMapLineDTO> list = new ArrayList<>();
|
||||
for (PositionMapLineDTO positionMapLineDO : positionMapLineDOS) {
|
||||
list.add(positionMapLineDO);
|
||||
if (DirectionEnum.ONE_WAY.getType().equals(positionMapLineDO.getDirection())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
list.add(setPositionMapLineDTOData(positionMapLineDO));
|
||||
List<PositionMapLineDTO> list = new ArrayList<>();
|
||||
for (PositionMapLineDTO positionMapLineDO : positionMapLineDOS) {
|
||||
list.add(positionMapLineDO);
|
||||
if (DirectionEnum.ONE_WAY.getType().equals(positionMapLineDO.getDirection())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
relatedPathNode.setControl_nodes(list);
|
||||
list.add(setPositionMapLineDTOData(positionMapLineDO));
|
||||
}
|
||||
|
||||
relatedPathNode.setControl_nodes(list);
|
||||
|
||||
pathPlanningApi.synchronousPointToPP(relatedPathNode, PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_LINE);
|
||||
|
||||
pathPlanningApi.synchronousPointToPP(relatedPathNode, PathPlanningTopicConstant.SYNCHRONOUS_ALL_MAP_LINE);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -60,4 +60,10 @@ public interface RobotTaskService extends IService<RobotTaskDO> {
|
||||
* @return
|
||||
*/
|
||||
String getTaskNo();
|
||||
|
||||
/**
|
||||
* PP分配的任务
|
||||
* @param message
|
||||
*/
|
||||
void ppDistributionTask(String message);
|
||||
}
|
||||
|
@ -7,6 +7,8 @@ import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
||||
import cn.iocoder.yudao.module.mqtt.enums.path.TaskTypeEnum;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.robot.task.TaskPPDistribution;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO;
|
||||
@ -23,6 +25,7 @@ import cn.iocoder.yudao.module.system.util.redis.RedissonUtils;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.gson.Gson;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.redisson.api.RLock;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
@ -31,10 +34,7 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ -606,13 +606,15 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
|
||||
&& RobotTaskStatusEnum.CLOSE.getType().equals(updateReqVO.getTaskStatus())
|
||||
&& !robotTaskDO.getTaskStatus().equals(updateReqVO.getTaskStatus())) {
|
||||
for (RobotTaskDetailDO taskDetailDO : taskDetailDOS) {
|
||||
if (RobotTaskDetailStatusEnum.DONE.getType().equals(taskDetailDO.getTaskStatus())) {
|
||||
if (!(RobotTaskDetailStatusEnum.NEW.getType().equals(taskDetailDO.getTaskStatus())
|
||||
&& RobotTaskDetailStatusEnum.DOING.getType().equals(taskDetailDO.getTaskStatus()))) {
|
||||
continue;
|
||||
}
|
||||
//后期需做状态映射
|
||||
taskDetailDO.setTaskStatus(updateReqVO.getTaskStatus());
|
||||
|
||||
// todo 关闭需要下发任务给车机 。 还需要考虑下处理中的任务怎么处理
|
||||
// todo 清楚交管
|
||||
|
||||
if (ObjectUtil.isNotEmpty(taskDetailDO.getFromLocationId())) {
|
||||
locationIds.add(taskDetailDO.getFromLocationId());
|
||||
@ -705,5 +707,65 @@ public class RobotTaskServiceImpl extends ServiceImpl<RobotTaskMapper,RobotTaskD
|
||||
String incrementByKey = redisUtil.getIncrementByKey(RobotCacheLockEnum.TASK_NO.getKey());
|
||||
return taskNo+ DateUtils.getYearMonthDay()+incrementByKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* PP分配的任务
|
||||
* @param message
|
||||
*/
|
||||
@Override
|
||||
public void ppDistributionTask(String message) {
|
||||
TaskPPDistribution[] array = new Gson().fromJson(message, TaskPPDistribution[].class);
|
||||
List<TaskPPDistribution> list = Arrays.asList(array);
|
||||
|
||||
List<TaskPPDistribution> taskList = list.stream()
|
||||
.filter(v -> TaskTypeEnum.TASK.getType().equals(v.getType()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
List<TaskPPDistribution> chargeList = list.stream()
|
||||
.filter(v -> TaskTypeEnum.CHARGE.getType().equals(v.getType()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
/**
|
||||
* 充电
|
||||
*/
|
||||
if (ObjectUtil.isNotEmpty(chargeList)) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 任务
|
||||
*/
|
||||
if (ObjectUtil.isNotEmpty(taskList)) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -160,6 +160,13 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
|
||||
Map<Long, WareHouseLocationDO> locationDOMap =
|
||||
locations.stream().collect(Collectors.toMap(v -> v.getId(), Function.identity()));
|
||||
|
||||
//能执行此任务的机器人 和 不能走的区域
|
||||
List<TaskRobotNoLimittationAreaDTO> robotNoLimitationArea = getRobotNoLimitationArea(robots, positionMapDOS);
|
||||
|
||||
Map<String, TaskRobotNoLimittationAreaDTO> robotNoLimittationAreaDTOMap =
|
||||
robotNoLimitationArea.stream().collect(Collectors.toMap(v -> v.getRobotNo(), Function.identity()));
|
||||
|
||||
log.info("开始组装需要下发给PP的任务");
|
||||
for (RobotTaskDetailDO taskDetailDO : taskDetailDOS) {
|
||||
|
||||
TaskToPathPlanningDTO pathPlanning = TaskToPathPlanningDTO.builder()
|
||||
@ -169,14 +176,19 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
|
||||
.createTime(taskDetailDO.getCreateTime())
|
||||
.build();
|
||||
|
||||
//能执行此任务的机器人 和 不能走的区域
|
||||
List<TaskRobotNoLimittationAreaDTO> robotNoLimitationArea = getRobotNoLimitationArea(robots, positionMapDOS,
|
||||
taskDetailDO.getRobotNo());
|
||||
if (ObjectUtil.isEmpty(robotNoLimitationArea)) {
|
||||
List<TaskRobotNoLimittationAreaDTO> robotNoLimitions = null;
|
||||
if (ObjectUtil.isNotEmpty(taskDetailDO.getRobotNo()) && ObjectUtil.isNotEmpty(robotNoLimittationAreaDTOMap)) {
|
||||
TaskRobotNoLimittationAreaDTO taskRobotNoLimittationAreaDTO = robotNoLimittationAreaDTOMap.get(taskDetailDO.getRobotNo());
|
||||
robotNoLimitions = Arrays.asList(taskRobotNoLimittationAreaDTO);
|
||||
}else if (ObjectUtil.isEmpty(taskDetailDO.getRobotNo())){
|
||||
robotNoLimitions = robotNoLimitationArea;
|
||||
}
|
||||
|
||||
if (ObjectUtil.isEmpty(robotNoLimitions)) {
|
||||
log.info("此任务明细,已经指定了机器人编号, 没有对应的机器人能执行此任务 :{}, 机器人编号:{}", taskDetailDO.getId(), taskDetailDO.getRobotNo());
|
||||
continue;
|
||||
}
|
||||
pathPlanning.setRobotNoLimitationAreaDTOS(robotNoLimitationArea);
|
||||
pathPlanning.setRobotNoLimitationAreaDTOS(robotNoLimitions);
|
||||
|
||||
//取是线库
|
||||
if (ObjectUtil.isNotEmpty(taskDetailDO.getFromLocationId())
|
||||
@ -226,15 +238,10 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService {
|
||||
* @param positionMapDOS
|
||||
*/
|
||||
private List<TaskRobotNoLimittationAreaDTO> getRobotNoLimitationArea(List<RobotInformationDO> robots,
|
||||
List<PositionMapDO> positionMapDOS,
|
||||
String robotNo) {
|
||||
List<PositionMapDO> positionMapDOS) {
|
||||
List<TaskRobotNoLimittationAreaDTO> robotNoLimitationAreaDTOS = new ArrayList<>();
|
||||
for (RobotInformationDO robot : robots) {
|
||||
|
||||
if (ObjectUtil.isNotEmpty(robotNo) && !robot.getRobotNo().equals(robotNo)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
TaskRobotNoLimittationAreaDTO robotNoLimitationAreaDTO = new TaskRobotNoLimittationAreaDTO();
|
||||
List<TaskLimitationAreaDTO> limitationAreaList = new ArrayList<>();
|
||||
robotNoLimitationAreaDTO.setRobotNo(robot.getRobotNo());
|
||||
|
Loading…
Reference in New Issue
Block a user