diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java index 6157d7ab9..891e634f6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/robot/RobotTaskStatusApiImpl.java @@ -28,14 +28,12 @@ import cn.iocoder.yudao.module.system.enums.robot.actionlog.ActionStatusEnum; import cn.iocoder.yudao.module.system.enums.robot.charge.ChargeTaskStatusEnum; import cn.iocoder.yudao.module.system.enums.robot.task.RobotStatusCodeEnum; import cn.iocoder.yudao.module.system.enums.robot.task.RobotTaskStageEnum; -import cn.iocoder.yudao.module.system.enums.wait.WaitStatusEnum; import cn.iocoder.yudao.module.system.service.information.DeviceInformationService; import cn.iocoder.yudao.module.system.service.log.RobotTaskDetailActionLogService; import cn.iocoder.yudao.module.system.service.path.PathPlanningService; import cn.iocoder.yudao.module.system.service.robot.RobotInformationService; import cn.iocoder.yudao.module.system.service.robot.RobotTaskDetailService; import cn.iocoder.yudao.module.system.service.robot.RobotWarnMsgService; -import cn.iocoder.yudao.module.system.service.wait.MoveToWaitService; import cn.iocoder.yudao.module.system.util.redis.RedisUtil; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; @@ -103,9 +101,6 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { @Resource private RobotWarnMsgService warnMsgService; - @Resource - private MoveToWaitService moveToWaitService; - @Resource private PathPlanningService pathPlanningService; @@ -183,7 +178,6 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { } taskDetailActionLogService.createTaskDetailActionLog(logOne); redisUtil.set(robotDoingActionKey, logOne.getActionMsg(), doingActionCacheTime); - moveToWaitService.updateWaitStatus(robotCompleteTaskDTO.getOrderId(), WaitStatusEnum.GO_TO_WAIT.getType()); } else { taskDoing(robotCompleteTaskDTO, robotDoingActionKey); } @@ -231,6 +225,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { //todo 后面考虑下充电,车机目前对充电的逻辑未定义 if (PathTaskTypeEnum.MOVE.getType().equals(robotCompleteTaskDTO.getOrderType()) || PathTaskTypeEnum.MOVE_TO_WAIT_STOP.getType().equals(robotCompleteTaskDTO.getOrderType()) + || PathTaskTypeEnum.MOVE_TO_WAIT.getType().equals(robotCompleteTaskDTO.getOrderType()) || PathTaskTypeEnum.TAKE.getType().equals(robotCompleteTaskDTO.getOrderType()) || PathTaskTypeEnum.CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType()) || PathTaskTypeEnum.RELEASE.getType().equals(robotCompleteTaskDTO.getOrderType())) { @@ -248,8 +243,6 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { } else if (CommandTypeEnum.WORK_DROP_OFF_GOODS.getType().equals(robotCompleteTaskDTO.getCommandStatus().getCommandType())) { taskDone(robotCompleteTaskDTO); } - } else if (PathTaskTypeEnum.MOVE_TO_WAIT.getType().equals(robotCompleteTaskDTO.getOrderType())) { - moveToWaitService.updateWaitStatus(robotCompleteTaskDTO.getOrderId(), WaitStatusEnum.REACH_WAIT.getType()); } else if (PathTaskTypeEnum.AUTO_CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType())) { RobotChargeLogDO build = RobotChargeLogDO .builder() @@ -334,8 +327,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { String solve = ""; String taskNo = ""; - if (!PathTaskTypeEnum.MOVE_TO_WAIT.getType().equals(robotCompleteTaskDTO.getOrderType()) - && !PathTaskTypeEnum.AUTO_CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType()) + if (!PathTaskTypeEnum.AUTO_CHARGE.getType().equals(robotCompleteTaskDTO.getOrderType()) && ObjectUtil.isEmpty(msg)) { taskNo = taskDetailService.getTaskNoByDetailId(robotCompleteTaskDTO.getOrderId()); solve = " 并且到任务列表关闭任务 " + taskNo; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemPageReqVO.java index d90bcc21a..487ff7091 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemPageReqVO.java @@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode; import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; +import javax.validation.constraints.NotEmpty; import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -52,7 +53,9 @@ public class PositionMapItemPageReqVO extends PageParam { @Schema(description = "排序的位置,越大越优先堆放") private Long locationNumber; - @Schema(description = "等待点使用状态(0.空闲 1.使用中)") + @Schema(description = "等待点使用状态, 0:空闲 ,1:前往停车点(预占用停车点) ,2.使用中(已经在停车位上)") private Integer useStatus; + @Schema(description = "AGV编号") + private String robotNo; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemRespVO.java index ca1d05c7c..ddf4b1b96 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemRespVO.java @@ -70,8 +70,12 @@ public class PositionMapItemRespVO { @ExcelProperty("排序的位置,越大越优先堆放") private Long locationNumber; - @Schema(description = "等待点使用状态(0.空闲 1.使用中)") - @ExcelProperty("等待点使用状态(0.空闲 1.使用中)") + @Schema(description = "等待点使用状态, 0:空闲 ,1:前往停车点(预占用停车点) ,2.使用中(已经在停车位上)") + @ExcelProperty("等待点使用状态, 0:空闲 ,1:前往停车点(预占用停车点) ,2.使用中(已经在停车位上)") private Integer useStatus; + @Schema(description = "AGV编号") + @ExcelProperty("等待点使用状态(0.空闲 1.使用中)") + private String robotNo; + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemSaveReqVO.java index eb927a3af..828a7ff07 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/positionmap/vo/PositionMapItemSaveReqVO.java @@ -43,6 +43,9 @@ public class PositionMapItemSaveReqVO { @Schema(description = "排序的位置,越大越优先堆放") private Long locationNumber; - @Schema(description = "等待点使用状态(0.空闲 1.使用中)") + @Schema(description = "等待点使用状态, 0:空闲 ,1:前往停车点(预占用停车点) ,2.使用中(已经在停车位上)") private Integer useStatus; + + @Schema(description = "AGV编号") + private String robotNo; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailAddVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailAddVO.java index bab918c20..b524b2b19 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailAddVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/vo/RobotTaskDetailAddVO.java @@ -9,6 +9,7 @@ import javax.validation.constraints.NotNull; @Data @Schema(description = "子列表") public class RobotTaskDetailAddVO { + private Long id; @Schema(description = "任务类型(1:取放货、2:停车、 3:充电、4:移动、5:仅取货、6:仅放货、7:扫描码、8:检测托盘类型、9:移动到点位)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") @NotNull(message = "任务类型(1:取放货、2:停车、 3:充电、4:移动、5:仅取货、6:仅放货、7:扫描码、8:检测托盘类型、9:移动到点位)不能为空") private Integer taskType; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionMapItemDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionMapItemDO.java index 727432fd1..eca00f0db 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionMapItemDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/positionmap/PositionMapItemDO.java @@ -78,8 +78,12 @@ public class PositionMapItemDO extends BaseDO { */ private Long locationNumber; /** - * 等待点使用状态(0.空闲 1.使用中) + * 等待点使用状态, 0:空闲 ,1:前往停车点(预占用停车点) ,2.使用中(已经在停车位上) */ private Integer useStatus; + /** + * AGV编号 + */ + private String robotNo; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/item/UseStatusEnum.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/item/UseStatusEnum.java new file mode 100644 index 000000000..760fc893b --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/item/UseStatusEnum.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.system.enums.item; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum UseStatusEnum { + + FREE(0,"空闲"), + PRE_OCCUPANCY(1,"前往停车点(预占用停车点)"), + USEING(2,"使用中(已经在停车位上)"); + /** + * 类型 + */ + private final Integer type; + + private final String msg; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/redis/RobotCacheLockEnum.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/redis/RobotCacheLockEnum.java index ea1d07445..67c93284b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/redis/RobotCacheLockEnum.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/enums/redis/RobotCacheLockEnum.java @@ -11,6 +11,7 @@ import lombok.Getter; public enum RobotCacheLockEnum { TASK_NO("task:robot:no", "任务号"), + MOVE_TASK_NO("task:robot:no:move", "移动任务号"), ROBOT_TASK_ADD_LOCK("robot:task:add:lock", "所有创建机器人任务的锁"), ROBOT_RCS_HEART_BEAT_LOCK("robot:rcs:heart:beat:lock", "RCS维持与车机心跳的锁"), ROBOT_STATISTICS_DURATION_LOCK("robot:statistics:duration:lock", "统计车辆工作时长的锁"), diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapItemServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapItemServiceImpl.java index a9f9e784f..282ceb6c3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapItemServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/positionmap/PositionMapItemServiceImpl.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.module.mqtt.api.task.dto.Pose2ds; import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant; import cn.iocoder.yudao.module.system.controller.admin.log.vo.UserOperationLogSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.PositionMapConditionDTO; @@ -15,6 +16,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.positionmap.PositionMapItem import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapItemMapper; import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum; import cn.iocoder.yudao.module.system.enums.item.PositionMapItemEnum; +import cn.iocoder.yudao.module.system.enums.item.UseStatusEnum; import cn.iocoder.yudao.module.system.service.log.UserOperationLogService; import cn.iocoder.yudao.module.system.util.redis.RedisUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -139,7 +141,13 @@ public class PositionMapItemServiceImpl extends ServiceImpl positionMapItems = positionMapItemMapper.selectList(new LambdaQueryWrapperX() + PositionMapItemDO positionMapItems = positionMapItemMapper.selectOne(new LambdaQueryWrapperX() .eq(PositionMapItemDO::getType, PositionMapItemEnum.STOP.getType()) - .eq(PositionMapItemDO::getUseStatus, ZeroOneEnum.ZERO.getType())); + .eq(PositionMapItemDO::getRobotNo, robotNo) + .last("limit 1")); + + if (ObjectUtil.isEmpty(positionMapItems)) { + positionMapItems = positionMapItemMapper.selectOne(new LambdaQueryWrapperX() + .eq(PositionMapItemDO::getType, PositionMapItemEnum.STOP.getType()) + .eq(PositionMapItemDO::getUseStatus, UseStatusEnum.FREE.getType()) + .last("limit 1")); + } if (ObjectUtil.isEmpty(positionMapItems)) { log.info("------没有空闲的停车点----- :{}", robotNo); throw exception(ROBOT_NOT_FOUND_WAIT_ITEM); } - List waitIds = positionMapItems - .stream() - .map(u -> u.getId() + "") - .collect(Collectors.toList()); - pathPlanning.setWaitIds(waitIds); + pathPlanning.setWaitIds(Collections.singletonList(positionMapItems.getId() + "")); } 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 9e9d5ebc2..e844907cb 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 @@ -48,6 +48,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskMapper; import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum; import cn.iocoder.yudao.module.system.enums.device.DeviceUseStatusEnum; +import cn.iocoder.yudao.module.system.enums.item.UseStatusEnum; import cn.iocoder.yudao.module.system.enums.path.PathTaskTypeEnum; import cn.iocoder.yudao.module.system.enums.redis.RobotCacheLockEnum; import cn.iocoder.yudao.module.system.enums.robot.*; @@ -158,9 +159,6 @@ public class RobotTaskServiceImpl extends ServiceImpl positionMapItemList = positionMapItemService.getPositionMapItemByIds(pointList); List list = positionMapItemList.stream() - .filter(v -> ZeroOneEnum.ONE.getType().equals(v.getUseStatus())) + .filter(v -> !UseStatusEnum.FREE.getType().equals(v.getUseStatus())) .map(PositionMapItemDO::getSortNum) .collect(Collectors.toList()); if (ObjectUtil.isNotEmpty(list)) { @@ -576,10 +574,6 @@ public class RobotTaskServiceImpl extends ServiceImpl taskDetails = getTaskDetail(montageTaskIds, singleTaskIds); if (taskDetails.isEmpty()) { log.info("暂无需要处理的明细任务"); - return pair; + return ImmutablePair.of(robots, null); } return ImmutablePair.of(robots, taskDetails); } 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 0c2cf6a6c..a9057ce4b 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 @@ -1,36 +1,36 @@ package cn.iocoder.yudao.module.system.service.robot.pathplanning; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.json.JSONUtil; +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.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.module.mqtt.api.common.CommonApi; import cn.iocoder.yudao.module.mqtt.api.path.task.TaskLimitationAreaDTO; import cn.iocoder.yudao.module.mqtt.api.path.task.TaskRobotNoLimittationAreaDTO; import cn.iocoder.yudao.module.mqtt.api.path.task.TaskToPathPlanningDTO; -import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO; -import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataPoseDTO; import cn.iocoder.yudao.module.system.constant.path.PathPlanningChcheConstant; import cn.iocoder.yudao.module.system.constant.path.PathPlanningTopicConstant; -import cn.iocoder.yudao.module.system.constant.robot.RobotTaskChcheConstant; -import cn.iocoder.yudao.module.system.controller.admin.positionmap.dto.RobotPositionMapDTO; +import cn.iocoder.yudao.module.system.controller.admin.robot.vo.RobotTaskDetailAddVO; import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO; 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.robot.RobotChargeLogDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotInformationDO; +import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotTaskDetailDO; -import cn.iocoder.yudao.module.system.dal.dataobject.wait.MoveToWaitDO; import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationMapper; import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapItemMapper; import cn.iocoder.yudao.module.system.dal.mysql.positionmap.PositionMapMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskDetailMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotTaskMapper; -import cn.iocoder.yudao.module.system.dal.mysql.wait.MoveToWaitMapper; import cn.iocoder.yudao.module.system.enums.common.ZeroOneEnum; import cn.iocoder.yudao.module.system.enums.item.PositionMapItemEnum; +import cn.iocoder.yudao.module.system.enums.item.UseStatusEnum; import cn.iocoder.yudao.module.system.enums.path.PathTaskTypeEnum; import cn.iocoder.yudao.module.system.enums.path.PathTaskTypeToRobotEnum; +import cn.iocoder.yudao.module.system.enums.redis.RobotCacheLockEnum; import cn.iocoder.yudao.module.system.enums.robot.*; import cn.iocoder.yudao.module.system.enums.robot.charge.ChargeModelEnum; import cn.iocoder.yudao.module.system.enums.robot.information.ChargeTypeEnum; @@ -93,8 +93,8 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { @Value("${zn.path_planning.task_chche_time:604800}") private Long taskChcheTime; - @Resource - private MoveToWaitMapper moveToWaitMapper; + @Value("${zn.move-no:MOVE}") + private String moveTaskNo; @Autowired private RobotTaskMapper robotTaskMapper; @@ -175,7 +175,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { private void moveRobotToWait(List robots) { robots = robots.stream() - .filter(v -> !v.getRobotStatus().equals(RobotStatusEnum.STAND_BY.getType())) + .filter(v -> v.getRobotStatus().equals(RobotStatusEnum.STAND_BY.getType())) .collect(Collectors.toList()); if (ObjectUtil.isEmpty(robots)) { log.info("------没有空闲的机器人可以去等待点-----"); @@ -183,135 +183,123 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { } List positionMapItems = positionMapItemMapper.selectList(new LambdaQueryWrapperX() - .eq(PositionMapItemDO::getType, PositionMapItemEnum.STOP.getType()) - .eq(PositionMapItemDO::getUseStatus, ZeroOneEnum.ZERO.getType())); + .eq(PositionMapItemDO::getType, PositionMapItemEnum.STOP.getType())); + if (ObjectUtil.isEmpty(positionMapItems)) { - log.info("------没有空闲的停车点-----"); + log.info("------没有设置停车点,无法派发空闲的车辆去停车-----"); return; } - List positionMaps = positionMapMapper.selectList(new LambdaQueryWrapperX()); - Map positionMap = - positionMaps.stream().collect(Collectors.toMap(v -> v.getFloor() + "_" + v.getArea(), Function.identity())); + List robotNos = robots.stream().map(RobotInformationDO::getRobotNo).collect(Collectors.toList()); - List list = new ArrayList<>(); - for (RobotInformationDO robot : robots) { - String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT + robot.getMacAddress(); - Object object = redisUtil.get(pose2dKey); - RobotStatusDataPoseDTO robotStatusDataPoseDTO = JSONUtil.toBean((String) object, RobotStatusDataPoseDTO.class); - if (ObjectUtil.isEmpty(object) || ObjectUtil.isEmpty(robotStatusDataPoseDTO)) { - log.info("------此机器人没有点位信息------ :{}", robot.getRobotNo()); - continue; - } - String floorAreaKey = RobotTaskChcheConstant.ROBOT_FLOOR_AREA + robot.getMacAddress(); - Object floorAreaObject = redisUtil.get(floorAreaKey); - FloorZoneDTO floorZoneDTO = JSONUtil.toBean((String) floorAreaObject, FloorZoneDTO.class); - - String mapKey = floorZoneDTO.getFloor() + "_" + floorZoneDTO.getArea(); - PositionMapDO positionMapDO = positionMap.get(mapKey); - if (ObjectUtil.isEmpty(positionMapDO)) { - log.info("------此机器人没有匹配到楼层和区域------ :{}", robot.getRobotNo()); - } - RobotPositionMapDTO build = RobotPositionMapDTO.builder() - .actualLocationX(robotStatusDataPoseDTO.getX()) - .actualLocationY(robotStatusDataPoseDTO.getY()) - .robotNo(robot.getRobotNo()) - .positionMapId(positionMapDO.getId()) - .type(PositionMapItemEnum.STOP.getType()) - .build(); - list.add(build); - } - - if (ObjectUtil.isEmpty(list)) { - log.info("------没有需要移动到等待点的机器人------"); - return; - } - - //在等待点的车 - List existItems = positionMapItemMapper.selectInWaitList(list); - if (ObjectUtil.isEmpty(existItems)) { - robotToWait(list, positionMapItems); - } else { - robotToWaitFilterWait(list, positionMapItems, existItems); - } - } - - /** - * 派部分车去停车点 - * - * @param list 车辆 - * @param freePositionMapItems 空闲点位 - * @param existItems 已经有车的点位 - */ - private void robotToWaitFilterWait(List list, List freePositionMapItems, - List existItems) { - Map robotNoPositionMap = - list.stream().collect(Collectors.toMap(v -> v.getActualLocationX() + "_" - + v.getActualLocationY() + "_" + v.getPositionMapId(), Function.identity())); - - Map existItemsMap = - existItems.stream().collect(Collectors.toMap(v -> v.getActualLocationX() + "_" - + v.getActualLocationY() + "_" + v.getPositionMapId(), Function.identity())); - - List needMoveToWaitList = new ArrayList<>(); - robotNoPositionMap.forEach((key, value) -> { - PositionMapItemDO positionMapItemDO = existItemsMap.get(key); - if (ObjectUtil.isEmpty(positionMapItemDO)) { - needMoveToWaitList.add(value); - } - }); - - if (ObjectUtil.isEmpty(needMoveToWaitList)) { - log.info("没有需要移动到等待点的车辆"); - return; - } - robotToWait(needMoveToWaitList, freePositionMapItems); - } - - /** - * 派车去停车点 - * - * @param list - * @param positionMapItems - */ - private void robotToWait(List list, List positionMapItems) { - if (positionMapItems.size() < list.size()) { - log.info("空闲停车点少于车辆数量"); - list = list.subList(0, positionMapItems.size()); - } - - List waitIds = positionMapItems - .stream() - .map(u -> u.getId() + "") + List existMapItems = positionMapItems.stream() + .filter(v -> ObjectUtil.isNotEmpty(v.getRobotNo()) && robotNos.contains(v.getRobotNo())) .collect(Collectors.toList()); - List waits = list.stream() - .map(v -> { - MoveToWaitDO build = MoveToWaitDO.builder().robotNo(v.getRobotNo()).build(); - return build; - }) - .collect(Collectors.toList()); - moveToWaitMapper.insertBatch(waits); + + //车辆直接分配的停车点集合 + List robotMapItems = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(existMapItems)) { + + for (PositionMapItemDO positionMapItem : positionMapItems) { + robotNos.removeIf(v -> v.equals(positionMapItem.getRobotNo())); + if (UseStatusEnum.USEING.getType().equals(positionMapItem.getUseStatus())) { + continue; + } + positionMapItem.setUseStatus(UseStatusEnum.PRE_OCCUPANCY.getType()); + robotMapItems.add(positionMapItem); + } + } + + if (ObjectUtil.isNotEmpty(robotNos)) { + List emptyMapItems = positionMapItems.stream() + .filter(v -> ObjectUtil.isEmpty(v.getRobotNo())) + .collect(Collectors.toList()); + if (ObjectUtil.isNotEmpty(emptyMapItems)) { + for (PositionMapItemDO positionMapItem : emptyMapItems) { + if (ObjectUtil.isEmpty(robotNos)) { + break; + } + positionMapItem.setRobotNo(robotNos.get(0)); + robotNos.removeIf(v -> v.equals(positionMapItem.getRobotNo())); + positionMapItem.setUseStatus(UseStatusEnum.PRE_OCCUPANCY.getType()); + robotMapItems.add(positionMapItem); + } + } + } + + if (ObjectUtil.isEmpty(robotMapItems)) { + log.info("车辆找不到合适的停车点,或者车辆都在停车点了,或者停车点不够用"); + return; + } + + Map positionMap = + robotMapItems.stream().collect(Collectors.toMap(PositionMapItemDO::getRobotNo, Function.identity())); + Map sortMap = positionMapItems.stream().collect(Collectors.toMap(PositionMapItemDO::getId, PositionMapItemDO::getSortNum)); + + + //机器人不能行走的区域 + List robotNoLimitationArea = getRobotNoLimitationArea(robots); + Map robotNoLimittationAreaDTOMap = + robotNoLimitationArea.stream().collect(Collectors.toMap(v -> v.getRobotNo(), Function.identity())); List pathPlanningList = new ArrayList<>(); - for (MoveToWaitDO wait : waits) { + List taskDetails = new ArrayList<>(); + List tasks = new ArrayList<>(); + for (PositionMapItemDO v : robotMapItems) { + RobotTaskDO task = new RobotTaskDO(); + String incrementByKey = redisUtil.getIncrementByKey(RobotCacheLockEnum.MOVE_TASK_NO.getKey()); + task.setTaskNo(moveTaskNo + DateUtils.getYearMonthDay() + incrementByKey); + task.setId(IdUtil.getSnowflakeNextId()); + task.setCycleNumber(0L); + task.setRemainingCycleNumber(0L); + task.setStartTime(LocalDateTime.now()); + tasks.add(task); + + RobotTaskDetailAddVO detailAddVO = new RobotTaskDetailAddVO(); + detailAddVO.setId(IdUtil.getSnowflakeNextId()); + detailAddVO.setRobotTaskId(task.getId()); + detailAddVO.setTaskType(RobotTaskTypeEnum.MOVE_TO_POINT.getType()); + detailAddVO.setReleaseType(ReleaseTakeEnum.TO_LOCATION.getType()); + detailAddVO.setReleaseId(v.getId()); + detailAddVO.setToLocationNo(sortMap.get(v.getId())+""); + detailAddVO.setRobotNo(v.getRobotNo()); + taskDetails.add(detailAddVO); + TaskToPathPlanningDTO pathPlanning = TaskToPathPlanningDTO.builder() - .orderId(String.valueOf(wait.getId())) + .orderId(detailAddVO.getId()+"") .orderType(PathTaskTypeEnum.MOVE_TO_WAIT.getType()) .priority(1l) .createTime(LocalDateTime.now()) .taskType(PathTaskTypeToRobotEnum.MOVE.getType()) - .waitIds(waitIds) + .waitIds(Collections.singletonList(v.getId() + "")) .build(); + + TaskRobotNoLimittationAreaDTO taskRobotNoLimittationAreaDTO = robotNoLimittationAreaDTOMap.get(v.getRobotNo()); + List robotNoLimitions = Arrays.asList(taskRobotNoLimittationAreaDTO); + pathPlanning.setRobotNoLimitationAreaDTOS(robotNoLimitions); + String key = PathPlanningChcheConstant.PATH_PLANNING_TASK + pathPlanning.getOrderId(); redisUtil.set(key, JSON.toJSONString(pathPlanning), taskChcheTime); pathPlanningList.add(pathPlanning); } + robotTaskMapper.insertBatch(tasks); + + List bean = BeanUtils.toBean(taskDetails, RobotTaskDetailDO.class); + robotTaskDetailMapper.insertBatch(bean); + + positionMapItemMapper.updateById(robotMapItems); + log.info("派车去停车点--任务下发给PP :{}", JSON.toJSONString(pathPlanningList)); commonApi.commonMethod(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST); + } + + + + @Override public void sendChargeTaskToPP(List logs, List taskDetailDOS, List robots) { @@ -406,7 +394,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { List positionMapItems = positionMapItemMapper.selectList(new LambdaQueryWrapperX() .eq(PositionMapItemDO::getType, PositionMapItemEnum.STOP.getType()) - .eq(PositionMapItemDO::getUseStatus, ZeroOneEnum.ZERO.getType())); + .eq(PositionMapItemDO::getUseStatus, UseStatusEnum.FREE.getType())); List waitIds = null; if (ObjectUtil.isNotEmpty(positionMapItems)) { waitIds = positionMapItems diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/wait/MoveToWaitService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/wait/MoveToWaitService.java index caa451047..627af4aa8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/wait/MoveToWaitService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/wait/MoveToWaitService.java @@ -50,7 +50,6 @@ public interface MoveToWaitService { */ PageResult getMoveToWaitPage(MoveToWaitPageReqVO pageReqVO); - void updateWaitStatus(Long orderId, Integer status); - void updateWaitStatusAndItrmId(Long orderId, Integer type, String waitId); + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/wait/MoveToWaitServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/wait/MoveToWaitServiceImpl.java index d872863dd..b5e8c6f52 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/wait/MoveToWaitServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/wait/MoveToWaitServiceImpl.java @@ -71,21 +71,6 @@ public class MoveToWaitServiceImpl implements MoveToWaitService { return moveToWaitMapper.selectPage(pageReqVO); } - @Override - public void updateWaitStatus(Long orderId, Integer status) { - MoveToWaitDO updateObj = new MoveToWaitDO(); - updateObj.setId(orderId); - updateObj.setWaitStatus(status); - moveToWaitMapper.updateById(updateObj); - } - @Override - public void updateWaitStatusAndItrmId(Long orderId, Integer status, String waitId) { - MoveToWaitDO updateObj = new MoveToWaitDO(); - updateObj.setId(orderId); - updateObj.setPositionMapItemId(Long.valueOf(waitId)); - updateObj.setWaitStatus(status); - moveToWaitMapper.updateById(updateObj); - } } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml index 5de4fb2e2..ecffa2903 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml @@ -185,7 +185,8 @@ justauth: timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 zn: - task-no: ZN #任务号开头 + task-no: TASK #任务号开头 + move-no: MOVE #自动移动任务号开头 camera_secret_key: A2C4rv7DY012c9ef #摄像头秘钥 do_cycle: true #是否开启循环 lane_auto_move: true #线库是否自动移库 true:线库执行自动移库 、false:线库关闭执行自动移库 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml index f00bf7ff9..0607eede6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml @@ -220,7 +220,8 @@ map: warn-path: /Users/aikai/Documents/json/ # 告警码值上传路径 zn: - task-no: ZN #任务号开头 + task-no: TASK #任务号开头 + move-no: MOVE #自动移动任务号开头 camera_secret_key: A2C4rv7DY012c9ef #摄像头秘钥 do_cycle: true #是否开启循环 lane_auto_move: true #线库是否自动移库 true:线库执行自动移库 、false:线库关闭执行自动移库 @@ -244,7 +245,7 @@ zn: task_chche_time: 1209600 #任务缓存的时间, 默认一星期 is_simulation: true # 是否为仿真环境 send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位 - restore_task_restart: false # 恢复任务是否全部重新执行 true:全部重新开始 + restore_task_restart: true # 恢复任务是否全部重新执行 true:全部重新开始 logging: file: diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-test.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-test.yaml index fbb041795..70407b60c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-test.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-test.yaml @@ -213,7 +213,8 @@ map: warn-path: D:\project\rcs\json\ # 告警码值上传路径 zn: - task-no: ZN #任务号开头 + task-no: TASK #任务号开头 + move-no: MOVE #自动移动任务号开头 camera_secret_key: A2C4rv7DY012c9ef #摄像头秘钥 do_cycle: true #是否开启循环 lane_auto_move: true #线库是否自动移库 true:线库执行自动移库 、false:线库关闭执行自动移库 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/positionmap/PositionMapItemMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/positionmap/PositionMapItemMapper.xml index 627a65cb1..c8776b168 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/positionmap/PositionMapItemMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/positionmap/PositionMapItemMapper.xml @@ -81,21 +81,9 @@ from ware_position_map_item - where deleted = '0' - - - and position_map_id = #{positionMapId} - - - and actual_location_x = #{actualLocationX} - - - and actual_location_y = #{actualLocationY}, - - - and type = #{type}, - + where (position_map_id, actual_location_x,actual_location_y,type) IN + + (#{item.positionMapId}, #{item.actualLocationX}, #{item.actualLocationY}, #{item.type})