PP分配任务

This commit is contained in:
cbs 2025-02-21 11:32:31 +08:00
parent 63909d1105
commit ccf5c1d7b5
11 changed files with 208 additions and 64 deletions

View File

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

View File

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

View File

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

View File

@ -16,4 +16,5 @@ public interface PathApi {
@Operation(summary = "路径规划需要初始化信息")
void pathInitData();
void ppDistributionTask(String message);
}

View File

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

View File

@ -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数据
*/

View File

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

View File

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

View File

@ -60,4 +60,10 @@ public interface RobotTaskService extends IService<RobotTaskDO> {
* @return
*/
String getTaskNo();
/**
* PP分配的任务
* @param message
*/
void ppDistributionTask(String message);
}

View File

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

View File

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