From ccf5c1d7b531c95dd4bf6663dce9aaa514593d7d Mon Sep 17 00:00:00 2001 From: cbs <18617195505@163.com> Date: Fri, 21 Feb 2025 11:32:31 +0800 Subject: [PATCH] =?UTF-8?q?PP=E5=88=86=E9=85=8D=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/mqtt/config/MqttFactory.java | 2 + .../module/mqtt/enums/DefineSubTopicEnum.java | 3 +- ...thPlanningDistributionTaskServiceImpl.java | 25 +++++++ .../yudao/module/system/api/path/PathApi.java | 1 + .../module/system/api/path/PathApiImpl.java | 32 ++++++++- .../path/PathPlanningTopicConstant.java | 5 ++ .../admin/robot/task/TaskPPDistribution.java | 26 +++++++ .../service/path/PathPlanningServiceImpl.java | 71 +++++++----------- .../service/robot/RobotTaskService.java | 6 ++ .../service/robot/RobotTaskServiceImpl.java | 72 +++++++++++++++++-- .../RobotPathPlanningServiceImpl.java | 29 +++++--- 11 files changed, 208 insertions(+), 64 deletions(-) create mode 100644 yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/PathPlanningDistributionTaskServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/task/TaskPPDistribution.java diff --git a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/config/MqttFactory.java b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/config/MqttFactory.java index f4369f14e..3f9940617 100644 --- a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/config/MqttFactory.java +++ b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/config/MqttFactory.java @@ -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); diff --git a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/enums/DefineSubTopicEnum.java b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/enums/DefineSubTopicEnum.java index 0e51e33b4..5128231be 100644 --- a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/enums/DefineSubTopicEnum.java +++ b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/enums/DefineSubTopicEnum.java @@ -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; diff --git a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/PathPlanningDistributionTaskServiceImpl.java b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/PathPlanningDistributionTaskServiceImpl.java new file mode 100644 index 000000000..7783232c2 --- /dev/null +++ b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/PathPlanningDistributionTaskServiceImpl.java @@ -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); + } +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApi.java index 96d424dc0..cda438444 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApi.java @@ -16,4 +16,5 @@ public interface PathApi { @Operation(summary = "路径规划需要初始化信息") void pathInitData(); + void ppDistributionTask(String message); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApiImpl.java index a6c4ba70c..5a4e1d843 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/path/PathApiImpl.java @@ -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); + } + + + + + + + + + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/path/PathPlanningTopicConstant.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/path/PathPlanningTopicConstant.java index f64664b97..711047bf4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/path/PathPlanningTopicConstant.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/path/PathPlanningTopicConstant.java @@ -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数据 */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/task/TaskPPDistribution.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/task/TaskPPDistribution.java new file mode 100644 index 000000000..da1aa397e --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/task/TaskPPDistribution.java @@ -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; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningServiceImpl.java index 125767e8a..b7c3d6115 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/path/PathPlanningServiceImpl.java @@ -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 positionMapDOS = positionMapMapper.selectList(new LambdaQueryWrapperX() - .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 positionLines = positionMapLineMapper.getAllPositionMapLine(positionMapLineDO); // List positionLines = positionMapLineMapper.selectList(new LambdaQueryWrapperX()); - 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 positionMapLineDOS) { - executor.execute(() -> { - List list = new ArrayList<>(); - for (PositionMapLineDTO positionMapLineDO : positionMapLineDOS) { - list.add(positionMapLineDO); - if (DirectionEnum.ONE_WAY.getType().equals(positionMapLineDO.getDirection())) { - continue; - } - list.add(setPositionMapLineDTOData(positionMapLineDO)); + List 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); - }); } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskService.java index 4bc5fc974..542ce38d3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskService.java @@ -60,4 +60,10 @@ public interface RobotTaskService extends IService { * @return */ String getTaskNo(); + + /** + * PP分配的任务 + * @param message + */ + void ppDistributionTask(String message); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java index 8e74c240a..881816eeb 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotTaskServiceImpl.java @@ -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 list = Arrays.asList(array); + + List taskList = list.stream() + .filter(v -> TaskTypeEnum.TASK.getType().equals(v.getType())) + .collect(Collectors.toList()); + + List chargeList = list.stream() + .filter(v -> TaskTypeEnum.CHARGE.getType().equals(v.getType())) + .collect(Collectors.toList()); + + /** + * 充电 + */ + if (ObjectUtil.isNotEmpty(chargeList)) { + + } + + /** + * 任务 + */ + if (ObjectUtil.isNotEmpty(taskList)) { + + } + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java index 51226a849..2cef5d936 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/pathplanning/RobotPathPlanningServiceImpl.java @@ -160,6 +160,13 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { Map locationDOMap = locations.stream().collect(Collectors.toMap(v -> v.getId(), Function.identity())); + //能执行此任务的机器人 和 不能走的区域 + List robotNoLimitationArea = getRobotNoLimitationArea(robots, positionMapDOS); + + Map 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 robotNoLimitationArea = getRobotNoLimitationArea(robots, positionMapDOS, - taskDetailDO.getRobotNo()); - if (ObjectUtil.isEmpty(robotNoLimitationArea)) { + List 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 getRobotNoLimitationArea(List robots, - List positionMapDOS, - String robotNo) { + List positionMapDOS) { List robotNoLimitationAreaDTOS = new ArrayList<>(); for (RobotInformationDO robot : robots) { - if (ObjectUtil.isNotEmpty(robotNo) && !robot.getRobotNo().equals(robotNo)) { - continue; - } - TaskRobotNoLimittationAreaDTO robotNoLimitationAreaDTO = new TaskRobotNoLimittationAreaDTO(); List limitationAreaList = new ArrayList<>(); robotNoLimitationAreaDTO.setRobotNo(robot.getRobotNo());