From 2ffbd9a4b86b8335aa7e58f53a7acc34d8ca942c Mon Sep 17 00:00:00 2001 From: cbs <18617195505@163.com> Date: Wed, 26 Mar 2025 14:37:09 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/enums/ErrorCodeConstants.java | 10 + .../path/PathPlanningChcheConstant.java | 9 + .../robot/RobotInformationController.java | 8 + .../robot/RobotInformationService.java | 6 + .../robot/RobotInformationServiceImpl.java | 309 +++++++++++++++++- .../service/robot/RobotTaskServiceImpl.java | 2 +- .../RobotPathPlanningService.java | 3 + .../RobotPathPlanningServiceImpl.java | 38 ++- .../src/main/resources/application-local.yaml | 3 +- 9 files changed, 364 insertions(+), 24 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/path/PathPlanningChcheConstant.java diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index ccac890ec..f482bf11a 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -187,6 +187,10 @@ public interface ErrorCodeConstants { ErrorCode ROBOT_INFORMATION_NOT_EXISTS = new ErrorCode(1-002-034-001, "车辆信息不存在"); ErrorCode ROBOT_MAC_ADDRESS_EXISTS = new ErrorCode(1-002-034-002, "MAC地址重复"); ErrorCode ROBOT_ROBOT_NO_EXISTS = new ErrorCode(1-002-034-003, "机器人编号重复"); + ErrorCode ROBOT_LAST_TASK_NO_EXISTS = new ErrorCode(1-002-034-004, "机器人前一个任务不存在或已经完成"); + ErrorCode ROBOT_LAST_TASK_DELETE = new ErrorCode(1-002-034-005, "超过限制的时间,无法继续执行前一个任务"); + ErrorCode ROBOT_NOT_FOUND_WAIT_ITEM = new ErrorCode(1-002-034-006, "没有空闲的停车点"); + ErrorCode ROBOT_NOT_FOUND_FREE_CHARGING_STATION = new ErrorCode(1-002-034-007, "没有空闲的充电桩"); // ========== 机器人任务主表 1-002-035-000 ========== ErrorCode TASK_NOT_EXISTS = new ErrorCode(1-002-035-001, "机器人任务主表不存在"); @@ -200,6 +204,12 @@ public interface ErrorCodeConstants { ErrorCode TASK_CHECK_UPDATE_STATUS = new ErrorCode(1-002-035-101, "订单更新失败"); ErrorCode TASK_CHECK_EXIST_NO = new ErrorCode(1-002-035-102, "订单号已存在"); ErrorCode TASK_TYPE_UN_EXIST = new ErrorCode(1-002-035-103, "找不到对应的任务类型"); + ErrorCode TASK_TAKE_LOCATION_EMPTY = new ErrorCode(1-002-035-104, "取货库位没有库存"); + ErrorCode TASK_TAKE_LOCATION_UPPER_LEVELS_NOT_EMPTY = new ErrorCode(1-002-035-105, "取货库位上层不为空"); + ErrorCode TASK_RELEASE_LOCATION_NOT_EMPTY = new ErrorCode(1-002-035-106, "放货库位不为空"); + ErrorCode TASK_RELEASE_LOCATION_LOWER_LEVELS_EMPTY = new ErrorCode(1-002-035-107, "放货库位下层为空"); + ErrorCode TASK_TAKE_LOCATION_HAVE_OTHER_TASK = new ErrorCode(1-002-035-108, "取货库位已经分配了其他任务"); + ErrorCode TASK_RELEASE_LOCATION_HAVE_OTHER_TASK = new ErrorCode(1-002-035-109, "放货库位已经分配了其他任务"); // ========== 机器人任务明细 1-002-036-000 ========== ErrorCode TASK_DETAIL_NOT_EXISTS = new ErrorCode(1-002-036-001, "机器人任务明细不存在"); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/path/PathPlanningChcheConstant.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/path/PathPlanningChcheConstant.java new file mode 100644 index 000000000..effbe5a2b --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/path/PathPlanningChcheConstant.java @@ -0,0 +1,9 @@ +package cn.iocoder.yudao.module.system.constant.path; + +/** + * 路径规划相关缓存 + */ +public class PathPlanningChcheConstant { + //发送给路径规划的任务 (拼接的是任务id) + public static String PATH_PLANNING_TASK = "path:planning:task"; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java index f2352747f..5d351a298 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/robot/RobotInformationController.java @@ -148,4 +148,12 @@ public class RobotInformationController { informationService.cleanTrafficManagement(robotNo); return success(true); } + + @PostMapping("/doTaskContinue") + @Operation(summary = "继续做任务") + @PreAuthorize("@ss.hasPermission('robot:information:doTaskContinue')") + public CommonResult doTaskContinue(@RequestParam("robotNo") String robotNo) { + informationService.doTaskContinue(robotNo); + return success(true); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java index 2dc2318bf..9ff303567 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationService.java @@ -144,4 +144,10 @@ public interface RobotInformationService extends IService { * @param robotNo */ void cleanTrafficManagement(String robotNo); + + /** + * 继续做任务 + * @param robotNo + */ + void doTaskContinue(String robotNo); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java index 3feaa20d5..0990f3bc3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/RobotInformationServiceImpl.java @@ -7,9 +7,13 @@ import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 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.framework.tenant.core.context.TenantContextHolder; 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.task.TaskRobotNoLimittationAreaDTO; +import cn.iocoder.yudao.module.mqtt.api.path.task.TaskToPathPlanningDTO; import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotAcceptTaskDTO; import cn.iocoder.yudao.module.mqtt.api.task.dto.RobotRcsHeartBeatDTO; import cn.iocoder.yudao.module.mqtt.enums.task.ExecutionTypeEnum; @@ -18,6 +22,7 @@ import cn.iocoder.yudao.module.system.api.robot.dto.FloorZoneDTO; import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDTO; import cn.iocoder.yudao.module.system.api.robot.dto.RobotStatusDataPoseDTO; import cn.iocoder.yudao.module.system.api.robot.vo.RobotInformationVO; +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.constant.robot.RobotTopicConstant; @@ -25,22 +30,32 @@ import cn.iocoder.yudao.module.system.controller.admin.log.vo.UserOperationLogSa import cn.iocoder.yudao.module.system.controller.admin.robot.proceed.RobotTaskProceedSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.robot.vo.*; import cn.iocoder.yudao.module.system.controller.admin.tool.dto.CleanAgvDTO; +import cn.iocoder.yudao.module.system.dal.dataobject.houselocation.WareHouseLocationDO; +import cn.iocoder.yudao.module.system.dal.dataobject.information.DeviceInformationDO; import cn.iocoder.yudao.module.system.dal.dataobject.informationmapassociation.InformationMapAssociationDO; import cn.iocoder.yudao.module.system.dal.dataobject.log.RobotTaskDetailActionLogDO; 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.RobotInformationDO; import cn.iocoder.yudao.module.system.dal.dataobject.robot.RobotModelDO; 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.information.DeviceInformationMapper; +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.RobotInformationMapper; import cn.iocoder.yudao.module.system.dal.mysql.robot.RobotModelMapper; 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.DeviceTypeEnum; import cn.iocoder.yudao.module.system.enums.device.DeviceUseStatusEnum; +import cn.iocoder.yudao.module.system.enums.item.PositionMapItemEnum; 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.RobotStatusEnum; import cn.iocoder.yudao.module.system.enums.robot.RobotTaskDetailStatusEnum; import cn.iocoder.yudao.module.system.enums.robot.RobotTaskModelEnum; @@ -51,12 +66,17 @@ import cn.iocoder.yudao.module.system.service.informationmapassociation.Informat import cn.iocoder.yudao.module.system.service.log.RobotTaskDetailActionLogService; import cn.iocoder.yudao.module.system.service.log.UserOperationLogService; import cn.iocoder.yudao.module.system.service.positionmap.PositionMapItemService; +import cn.iocoder.yudao.module.system.service.robot.pathplanning.RobotPathPlanningService; import cn.iocoder.yudao.module.system.service.robot.proceed.RobotTaskProceedService; import cn.iocoder.yudao.module.system.service.wait.MoveToWaitService; import cn.iocoder.yudao.module.system.util.redis.RedisUtil; +import cn.iocoder.yudao.module.system.util.redis.RedissonUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -67,6 +87,7 @@ import java.util.function.Function; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** @@ -114,6 +135,12 @@ public class RobotInformationServiceImpl extends ServiceImpl() + .eq(RobotInformationDO::getRobotNo, actionLog.getRobotNo())); + TaskRobotNoLimittationAreaDTO taskRobotNoLimittationAreaDTO = + robotPathPlanningService.getRobotNoLimitationArea(Collections.singletonList(robotInformationDO)).get(0); + + List robotNoLimitions = Arrays.asList(taskRobotNoLimittationAreaDTO); + pathPlanning.setRobotNoLimitationAreaDTOS(robotNoLimitions); + + if (PathTaskTypeEnum.MOVE_TO_WAIT.getType().equals(actionLog.getCommandType()) + || PathTaskTypeEnum.MOVE_TO_WAIT_STOP.getType().equals(actionLog.getCommandType())) { + moveToWaitTask(pathPlanning, actionLog.getRobotNo()); + } else if (PathTaskTypeEnum.CHARGE.getType().equals(actionLog.getCommandType()) + || PathTaskTypeEnum.AUTO_CHARGE.getType().equals(actionLog.getCommandType())) { + chargeTask(pathPlanning,robotInformationDO); + } else if (PathTaskTypeEnum.TAKE_RELEASE.getType().equals(actionLog.getCommandType())) { + takeReleaseTask(pathPlanning); + } else if (PathTaskTypeEnum.TAKE.getType().equals(actionLog.getCommandType())) { + takeTask(pathPlanning); + }else if (PathTaskTypeEnum.RELEASE.getType().equals(actionLog.getCommandType())) { + releaseTask(pathPlanning); + }else if (PathTaskTypeEnum.MOVE.getType().equals(actionLog.getCommandType())) { + + } + + List pathPlanningList = new ArrayList<>(); + pathPlanningList.add(pathPlanning); + log.info("任务下发给PP :{}", JSON.toJSONString(pathPlanningList)); + pathPlanningApi.synchronousLineObject(pathPlanningList, PathPlanningTopicConstant.TASK_ASSIGNMENT_REQUEST); + } + + /** + * 仅放货 + * @param pathPlanning + */ + private void releaseTask(TaskToPathPlanningDTO pathPlanning) { + RobotTaskDetailDO robotTaskDetail = checkTaskDone(pathPlanning.getOrderId()); + releaseCheck(robotTaskDetail.getToLocationId(), robotTaskDetail.getRobotTaskId()); + } + + /** + * 仅取货 + * @param pathPlanning + */ + private void takeTask(TaskToPathPlanningDTO pathPlanning) { + RobotTaskDetailDO robotTaskDetail = checkTaskDone(pathPlanning.getOrderId()); + takeCheck(robotTaskDetail.getFromLocationId(),robotTaskDetail.getRobotTaskId()); + } + + public RobotTaskDetailDO checkTaskDone(String id){ + RobotTaskDetailDO robotTaskDetail = taskDetailMapper.selectById(id); + if (RobotTaskStageEnum.DONE.getType().equals(robotTaskDetail.getTaskStage())) { + throw exception(ROBOT_LAST_TASK_NO_EXISTS); + } + return robotTaskDetail; + } + + /** + * 取放货 + * @param pathPlanning + */ + private void takeReleaseTask(TaskToPathPlanningDTO pathPlanning) { + RobotTaskDetailDO robotTaskDetail = checkTaskDone(pathPlanning.getOrderId()); + if (!RobotTaskStageEnum.TAKEING.getType().equals(robotTaskDetail.getTaskStage()) + && !RobotTaskStageEnum.GO_TAKE.getType().equals(robotTaskDetail.getTaskStage()) + && !RobotTaskStageEnum.UN_START.getType().equals(robotTaskDetail.getTaskStage())) { + //只要放货 + pathPlanning.setTakeLevel(null); + pathPlanning.setTakeGroupId(null); + pathPlanning.setTakeLocationNumber(null); + pathPlanning.setTakePointId(null); + pathPlanning.setTakeOffsetHeight(null); + pathPlanning.setTakeOffsetHeight(null); + pathPlanning.setTaskType(PathTaskTypeToRobotEnum.DROP_OFF_GOODS.getType()); + }else { + takeCheck(robotTaskDetail.getFromLocationId(), robotTaskDetail.getRobotTaskId()); + } + releaseCheck(robotTaskDetail.getToLocationId(),robotTaskDetail.getRobotTaskId()); + } + + /** + * 校验放货任务 + * + * @param id + * @param takeId + */ + private void releaseCheck(Long id, Long takeId) { + WareHouseLocationDO wareHouseLocation = wareHouseLocationMapper.selectById(id); + if (ZeroOneEnum.ONE.getType().equals(wareHouseLocation.getLocationUseStatus())) { + throw exception(TASK_RELEASE_LOCATION_NOT_EMPTY); + } + if (!wareHouseLocation.getTaskId().equals(takeId)) { + throw exception(TASK_RELEASE_LOCATION_HAVE_OTHER_TASK); + } + List locations = wareHouseLocationMapper.selectList(new LambdaQueryWrapperX() + .eq(WareHouseLocationDO::getMapItemId, wareHouseLocation.getMapItemId()) + .ne(WareHouseLocationDO::getId,id)); + if (ObjectUtil.isEmpty(locations)) { + return; + } + List bigNumbers = locations.stream() + .filter(v -> v.getLocationNumber() > wareHouseLocation.getLocationNumber() + && ZeroOneEnum.ZERO.getType().equals(v.getLocationUseStatus())) + .collect(Collectors.toList()); + if (ObjectUtil.isNotEmpty(bigNumbers)) { + throw exception(TASK_RELEASE_LOCATION_LOWER_LEVELS_EMPTY); + } + } + + /** + * 取货校验 + * + * @param id + * @param takeId + */ + private void takeCheck(Long id, Long takeId) { + WareHouseLocationDO wareHouseLocation = wareHouseLocationMapper.selectById(id); + if (ZeroOneEnum.ZERO.getType().equals(wareHouseLocation.getLocationUseStatus())) { + throw exception(TASK_TAKE_LOCATION_EMPTY); + } + + if (!wareHouseLocation.getTaskId().equals(takeId)) { + throw exception(TASK_TAKE_LOCATION_HAVE_OTHER_TASK); + } + + List locations = wareHouseLocationMapper.selectList(new LambdaQueryWrapperX() + .eq(WareHouseLocationDO::getMapItemId, wareHouseLocation.getMapItemId()) + .ne(WareHouseLocationDO::getId,id)); + if (ObjectUtil.isEmpty(locations)) { + return; + } + List bigNumbers = locations.stream() + .filter(v -> v.getLocationNumber() < wareHouseLocation.getLocationNumber() + && ZeroOneEnum.ONE.getType().equals(v.getLocationUseStatus())) + .collect(Collectors.toList()); + if (ObjectUtil.isNotEmpty(bigNumbers)) { + throw exception(TASK_TAKE_LOCATION_UPPER_LEVELS_NOT_EMPTY); + } + + } + + /** + * 充电任务 + * @param pathPlanning + * @param robot + */ + private void chargeTask(TaskToPathPlanningDTO pathPlanning, RobotInformationDO robot) { + List deviceInformations = deviceInformationMapper.selectList(new LambdaQueryWrapperX() + .eq(DeviceInformationDO::getDeviceEnable, ZeroOneEnum.ONE.getType()) + .eq(DeviceInformationDO::getDeviceUseStatus, DeviceUseStatusEnum.IDLE.getType()) + .eq(DeviceInformationDO::getDeviceType, DeviceTypeEnum.CHARGING_STATION.getType())); + if (ObjectUtil.isEmpty(deviceInformations)) { + log.info("没有空闲的充电桩 :{}",robot.getRobotNo()); + throw exception(ROBOT_NOT_FOUND_FREE_CHARGING_STATION); + } + + DeviceInformationDO deviceInformationDO = deviceInformations.stream() + .filter(v -> v.getDeviceAttribute().equals(robot.getChargeType()) + && robot.getFloorAreaJson().contains(v.getPositionMapId())) + .findFirst() + .orElse(new DeviceInformationDO()); + if (ObjectUtil.isEmpty(deviceInformationDO.getDeviceNo())) { + log.info("当前机器人查不到对应的充电桩类型、或者机器人不能在此区域充电 :{}",robot.getRobotNo()); + throw exception(ROBOT_NOT_FOUND_FREE_CHARGING_STATION); + } + + pathPlanning.setReleaseGroupId("POINT_" + deviceInformationDO.getPositionMapItemId()); + pathPlanning.setReleasePointId(deviceInformationDO.getPositionMapItemId()); + } + + /** + * 移动到等待点 + * + * @param pathPlanning + */ + private void moveToWaitTask(TaskToPathPlanningDTO pathPlanning, String robotNo) { + + List positionMapItems = positionMapItemMapper.selectList(new LambdaQueryWrapperX() + .eq(PositionMapItemDO::getType, PositionMapItemEnum.STOP.getType()) + .eq(PositionMapItemDO::getUseStatus, ZeroOneEnum.ZERO.getType())); + + 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); + } + /** * 取放货清除交管 + * * @param robotTaskDetail */ private void takeReleaseCleanTrafficManagement(RobotTaskDetailDO robotTaskDetail) { if (RobotTaskStageEnum.UN_START.getType().equals(robotTaskDetail.getTaskStage()) - || RobotTaskStageEnum.GO_TAKE.getType().equals(robotTaskDetail.getTaskStage()) - || RobotTaskStageEnum.GO_RELEASE.getType().equals(robotTaskDetail.getTaskStage())) { - log.info("清除交管--任务阶段是前往取货/待执行/前往放货 :{}",robotTaskDetail.getRobotNo()); + || RobotTaskStageEnum.GO_TAKE.getType().equals(robotTaskDetail.getTaskStage())) { + log.info("清除交管--任务阶段是前往取货/待执行/前往放货 :{}", robotTaskDetail.getRobotNo()); robotTaskDetail.setTaskStatus(RobotTaskDetailStatusEnum.NEW.getType()); robotTaskDetail.setRobotNo(null); taskDetailMapper.updateById(robotTaskDetail); @@ -739,6 +1025,7 @@ public class RobotInformationServiceImpl extends ServiceImpl logs, List taskDetailDOS, List robots); + + List getRobotNoLimitationArea(List robots); } 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 892abc526..1d3c1ac96 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 @@ -10,6 +10,7 @@ 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; @@ -92,6 +93,9 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { @Value("${zn.robot_config.offset_height}") private Double offsetHeight; + @Value("${zn.path_planning.task_chche_time:604800}") + private Long taskChcheTime; + @Resource private MoveToWaitMapper moveToWaitMapper; @@ -136,6 +140,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { /** * 处理停车不锁车的任务 + * * @param taskDetailDOS * @return */ @@ -144,9 +149,9 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { List detailList = new ArrayList<>(); for (RobotTaskDetailDO v : taskDetailDOS) { if (RobotTaskTypeEnum.PARK.getType().equals(v.getTaskType()) - && ZeroOneEnum.ZERO.getType().equals(v.getNeedLock())) { + && ZeroOneEnum.ZERO.getType().equals(v.getNeedLock())) { parkList.add(v); - }else if (!RobotTaskTypeEnum.CHARGE.getType().equals(v.getTaskType())){ + } else if (!RobotTaskTypeEnum.CHARGE.getType().equals(v.getTaskType())) { detailList.add(v); } } @@ -298,6 +303,8 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { .taskType(PathTaskTypeToRobotEnum.MOVE.getType()) .waitIds(waitIds) .build(); + String key = PathPlanningChcheConstant.PATH_PLANNING_TASK + pathPlanning.getOrderId(); + redisUtil.set(key, JSON.toJSONString(pathPlanning), taskChcheTime); pathPlanningList.add(pathPlanning); } @@ -354,6 +361,10 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { pathPlanning.setReleaseGroupId("POINT_" + v.getPositionMapItemId()); pathPlanning.setReleaseLocationNumber(releaseLocationNumberConfig); pathPlanning.setReleasePointId(v.getPositionMapItemId()); + + String key = PathPlanningChcheConstant.PATH_PLANNING_TASK + pathPlanning.getOrderId(); + redisUtil.set(key, JSON.toJSONString(pathPlanning), taskChcheTime); + pathPlanningList.add(pathPlanning); } @@ -418,10 +429,10 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { .build(); if (RobotTaskTypeEnum.PARK.getType().equals(taskDetailDO.getTaskType()) - && (ObjectUtil.isEmpty(waitIds) || waitIds.size() < i)) { - log.info("停车任务,没有多余的空闲点位 :{}",taskDetailDO.getId()); + && (ObjectUtil.isEmpty(waitIds) || waitIds.size() < i)) { + log.info("停车任务,没有多余的空闲点位 :{}", taskDetailDO.getId()); return; - }else if (RobotTaskTypeEnum.PARK.getType().equals(taskDetailDO.getTaskType())) { + } else if (RobotTaskTypeEnum.PARK.getType().equals(taskDetailDO.getTaskType())) { pathPlanning.setWaitIds(waitIds); i++; } @@ -460,12 +471,12 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { pathPlanning.setTakeOffsetHeight(offsetHeight); if (ObjectUtil.isNotEmpty(taskDetailDO.getFromLaneId())) { pathPlanning.setTakeGroupId("LINE_" + taskDetailDO.getFromLaneId()); - }else { + } else { pathPlanning.setTakeGroupId("POINT_" + taskDetailDO.getFromMapItemId()); } } - if (ObjectUtil.isNotEmpty(taskDetailDO.getToLocationId())){ + if (ObjectUtil.isNotEmpty(taskDetailDO.getToLocationId())) { pathPlanning.setReleaseLocationNumber(taskDetailDO.getToLocationNumber()); pathPlanning.setReleasePointId(toLocation.getMapItemId()); if (ObjectUtil.isNotEmpty(toLocation.getLocationTrayHeight())) { @@ -473,12 +484,16 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { } pathPlanning.setReleaseLevel(toLocation.getLocationStorey()); pathPlanning.setReleaseOffsetHeight(offsetHeight); - if (ObjectUtil.isNotEmpty(taskDetailDO.getToLaneId())){ + if (ObjectUtil.isNotEmpty(taskDetailDO.getToLaneId())) { pathPlanning.setReleaseGroupId("LINE_" + taskDetailDO.getToLaneId()); - }else { + } else { pathPlanning.setReleaseGroupId("POINT_" + taskDetailDO.getToMapItemId()); } } + + String key = PathPlanningChcheConstant.PATH_PLANNING_TASK + pathPlanning.getOrderId(); + redisUtil.set(key, JSON.toJSONString(pathPlanning), taskChcheTime); + pathPlanningList.add(pathPlanning); } @@ -544,7 +559,8 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { * * @param robots */ - private List getRobotNoLimitationArea(List robots) { + @Override + public List getRobotNoLimitationArea(List robots) { List positionMapDOS = positionMapMapper.selectList(new LambdaQueryWrapperX()); List robotNoLimitationAreaDTOS = new ArrayList<>(); @@ -664,7 +680,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { } else if (RobotTaskTypeEnum.TAKE.getType().equals(v.getTaskType())) { //仅取货 takeSetTask(list, v, fromLane, toLane, fromLocation, toLocation, toHaveFrom, fromHaveTo); - }else if (RobotTaskTypeEnum.PARK.getType().equals(v.getTaskType())) { + } else if (RobotTaskTypeEnum.PARK.getType().equals(v.getTaskType())) { list.add(v); } } 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 2ea7cdc98..420b74245 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 @@ -240,4 +240,5 @@ zn: offset_height: 0.1 #叉起货需要在原来高度基础上偏移的高度 default_tray_height: 1.1 #默认每层高度 open_rate_limiter: true #是否开启限流 - + path_planning: + task_chche_time: 604800 #任务缓存的时间, 默认一星期