diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskDetailMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskDetailMapper.java index 45ac5f054..1d9ce2b90 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskDetailMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskDetailMapper.java @@ -109,4 +109,10 @@ public interface RobotTaskDetailMapper extends BaseMapperX { * @return */ List getLastTaskGroupByRobotNo(); + + /** + * 设置状态为完成 + * @param ids + */ + void updateDoneByIds(@Param("ids") List ids); } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskMapper.java index 6e5466881..b195f3e89 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotTaskMapper.java @@ -73,4 +73,10 @@ public interface RobotTaskMapper extends BaseMapperX { */ IPage selectLogPageList(@Param("mpPage") IPage mpPage, @Param("pageReqVO") RobotTaskDetailLogVO pageReqVO); + + /** + * 更新任务完成 + * @param ids + */ + void updateDoneByIds(@Param("ids") List ids); } \ 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/robot/job/AutoChargeServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/AutoChargeServiceImpl.java index 527af697b..528e05212 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/AutoChargeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/AutoChargeServiceImpl.java @@ -219,7 +219,7 @@ public class AutoChargeServiceImpl implements AutoChargeService { } if (ObjectUtil.isNotEmpty(detailMap) && detailMap.containsKey(robot.getRobotNo()) - && ObjectUtil.isEmpty(robot.getAutoCharge()) && ObjectUtil.isNotEmpty(chargeConfig.getStartAutoCharge())) { + && ObjectUtil.isNotEmpty(chargeConfig.getStartAutoCharge())) { //任务充电 BigDecimal robotConfigElectricity = new BigDecimal(String.valueOf(chargeConfig.getStartAutoCharge())); if (robotRemainingElectricity.compareTo(robotConfigElectricity) < 0) { @@ -234,7 +234,7 @@ public class AutoChargeServiceImpl implements AutoChargeService { } if (ObjectUtil.isNotEmpty(detailMap) && detailMap.containsKey(robot.getRobotNo()) - && ObjectUtil.isEmpty(robot.getAutoCharge()) && ObjectUtil.isNotEmpty(chargeConfig.getChanceChargeStart())) { + && ObjectUtil.isNotEmpty(chargeConfig.getChanceChargeStart())) { //任务充电 BigDecimal robotConfigElectricity = new BigDecimal(String.valueOf(chargeConfig.getChanceChargeStart())); if (robotRemainingElectricity.compareTo(robotConfigElectricity) < 0) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/CycleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/CycleServiceImpl.java index 28449f9b1..f613f8249 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/CycleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/CycleServiceImpl.java @@ -97,9 +97,11 @@ public class CycleServiceImpl implements CycleService { List taskDetailDOS = getTaskDetailData(taskData,taskIdMap,v.getId()); taskDOList.add(taskData); taskDetailList.addAll(taskDetailDOS); + v.setRemainingCycleNumber(0l); } taskMapper.insertBatch(taskDOList); + taskMapper.updateBatch(taskList); taskDetailMapper.insertBatch(taskDetailList); List fromLocationIds = taskDetailList.stream().map(RobotTaskDetailDO::getFromLocationId).collect(Collectors.toList()); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/DistributeTasksServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/DistributeTasksServiceImpl.java index 18ea6487d..cc25a956d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/DistributeTasksServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/robot/job/DistributeTasksServiceImpl.java @@ -98,6 +98,8 @@ public class DistributeTasksServiceImpl implements DistributeTasksService { lastTaskDetailMap = lastTaskDetails.stream().collect(Collectors.toMap(v -> v.getRobotNo(), Function.identity())); } + CommonConfigVO chargeConfig = JSONUtil.toBean(commonConfigDO.getConfigStr(), CommonConfigVO.class); + for (RobotInformationDO robot : robots) { String taskStatusKey = RobotTaskChcheConstant.ROBOT_TASK_STATUS + robot.getMacAddress(); String cargoDetectedKey = RobotTaskChcheConstant.ROBOT_CARGO_DETECTED + robot.getMacAddress(); @@ -114,6 +116,19 @@ public class DistributeTasksServiceImpl implements DistributeTasksService { continue; } + if (ObjectUtil.isNotEmpty(chargeConfig) && ObjectUtil.isNotEmpty(chargeConfig.getStartAutoCharge())) { + String pose2dKey = RobotTaskChcheConstant.ROBOT_INFORMATION_POSE_BAT_SOC + robot.getMacAddress(); + Object poseCache = redisUtil.get(pose2dKey); + RobotStatusDataPoseDTO dataPoseDTO = JSON.parseObject((String) poseCache, RobotStatusDataPoseDTO.class); + BigDecimal robotRemainingElectricity = new BigDecimal(dataPoseDTO.getBatSoc()); + BigDecimal robotEndElectricity = new BigDecimal(chargeConfig.getStartAutoCharge()+""); + if (robotRemainingElectricity.compareTo(robotEndElectricity) < 0) { + robot.setRobotStatus(RobotStatusEnum.DOING.getType()); + log.info("机器人的电量少于自动充电电量,不能接任务 :{}",robot.getRobotNo()); + continue; + } + } + if (ObjectUtil.isEmpty(cargoDetected) || RobotStatusCodeConstant.CARGO_DETECTED.equals(Boolean.parseBoolean(String.valueOf(cargoDetected)))) { robot.setRobotStatus(RobotStatusEnum.DOING.getType()); log.info("车机上报传感器被按下--不允许接任务 :{}",robot.getRobotNo()); 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 b24c08e17..9b938c695 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 @@ -23,6 +23,7 @@ import cn.iocoder.yudao.module.system.dal.mysql.houselocation.WareHouseLocationM 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; @@ -93,6 +94,9 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { @Resource private MoveToWaitMapper moveToWaitMapper; + @Autowired + private RobotTaskMapper robotTaskMapper; + /** * 下发任务给PP */ @@ -117,11 +121,46 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { return; } + //停车不锁车 + taskDetailDOS = doPark(taskDetailDOS); + if (ObjectUtil.isEmpty(taskDetailDOS)) { + log.info("--不存在需要执行的任务---"); + return; + } + log.info("-------查找到车子和任务------"); distributeTasksToPP(robots, taskDetailDOS); } + /** + * 处理停车不锁车的任务 + * @param taskDetailDOS + * @return + */ + private List doPark(List taskDetailDOS) { + List parkList = new ArrayList<>(); + List detailList = new ArrayList<>(); + for (RobotTaskDetailDO v : taskDetailDOS) { + if (RobotTaskTypeEnum.PARK.getType().equals(v.getTaskType()) + && ZeroOneEnum.ZERO.getType().equals(v.getNeedLock())) { + parkList.add(v); + }else if (!RobotTaskTypeEnum.CHARGE.getType().equals(v.getTaskType())){ + detailList.add(v); + } + } + + if (ObjectUtil.isNotEmpty(parkList)) { + List detailIds = parkList.stream().map(RobotTaskDetailDO::getId).collect(Collectors.toList()); + List taskDetails = robotTaskDetailMapper.selectBatchIds(detailIds); + List taskIds = taskDetails.stream().map(RobotTaskDetailDO::getRobotTaskId).collect(Collectors.toList()); + robotTaskDetailMapper.updateDoneByIds(detailIds); + robotTaskMapper.updateDoneByIds(taskIds); + } + + return detailList; + } + /** * 派车辆去等待点 * @@ -252,6 +291,7 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { .priority(1l) .createTime(LocalDateTime.now()) .taskType(PathTaskTypeToRobotEnum.MOVE.getType()) + .waitIds(waitIds) .build(); pathPlanningList.add(pathPlanning); } @@ -348,6 +388,18 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { //前一个任务是仅取货 List robotDoTake = getRobotDoTake(robots); + List positionMapItems = positionMapItemMapper.selectList(new LambdaQueryWrapperX() + .eq(PositionMapItemDO::getType, PositionMapItemEnum.STOP.getType()) + .eq(PositionMapItemDO::getUseStatus, ZeroOneEnum.ZERO.getType())); + List waitIds = null; + if (ObjectUtil.isNotEmpty(positionMapItems)) { + waitIds = positionMapItems + .stream() + .map(u -> u.getId() + "") + .collect(Collectors.toList()); + } + Integer i = 0; + log.info("开始组装需要下发给PP的任务"); for (RobotTaskDetailDO taskDetailDO : taskDetailDOS) { @@ -360,6 +412,15 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { .createTime(taskDetailDO.getCreateTime()) .build(); + if (RobotTaskTypeEnum.PARK.getType().equals(taskDetailDO.getTaskType()) + && (ObjectUtil.isEmpty(waitIds) || waitIds.size() < i)) { + log.info("停车任务,没有多余的空闲点位 :{}",taskDetailDO.getId()); + return; + }else if (RobotTaskTypeEnum.PARK.getType().equals(taskDetailDO.getTaskType())) { + pathPlanning.setWaitIds(waitIds); + i++; + } + if (ObjectUtil.isNotEmpty(robotDoTake) && ObjectUtil.isNotEmpty(taskDetailDO.getRobotNo()) && robotDoTake.contains(taskDetailDO.getRobotNo()) && !RobotTaskTypeEnum.RELEASE.getType().equals(taskDetailDO.getTaskType())) { @@ -383,51 +444,36 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { WareHouseLocationDO fromLocation = locationDOMap.get(taskDetailDO.getFromLocationId()); WareHouseLocationDO toLocation = locationDOMap.get(taskDetailDO.getToLocationId()); - //取是线库 - if (ObjectUtil.isNotEmpty(taskDetailDO.getFromLocationId()) - && ObjectUtil.isNotEmpty(taskDetailDO.getFromLaneId())) { - pathPlanning.setTakeGroupId("LINE_" + taskDetailDO.getFromLaneId()); + if (ObjectUtil.isNotEmpty(taskDetailDO.getFromLocationId())) { pathPlanning.setTakeLocationNumber(Math.abs(locationNumberReduce - taskDetailDO.getFromLocationNumber())); pathPlanning.setTakePointId(fromLocation.getMapItemId()); - pathPlanning.setTakeHeight(Double.valueOf(fromLocation.getLocationTrayHeight() + "")); - pathPlanning.setTakeLevel(fromLocation.getLocationStorey()); - pathPlanning.setTakeOffsetHeight(offsetHeight); - - } else if (ObjectUtil.isNotEmpty(taskDetailDO.getFromLocationId()) - && ObjectUtil.isEmpty(taskDetailDO.getFromLaneId())) { - //取的是普通点位 - pathPlanning.setTakeGroupId("POINT_" + taskDetailDO.getFromMapItemId()); - pathPlanning.setTakeLocationNumber(Math.abs(locationNumberReduce - taskDetailDO.getFromLocationNumber())); - pathPlanning.setTakePointId(fromLocation.getMapItemId()); - pathPlanning.setTakeHeight(Double.valueOf(fromLocation.getLocationTrayHeight() + "")); + if (ObjectUtil.isNotEmpty(fromLocation.getLocationTrayHeight())) { + pathPlanning.setTakeHeight(Double.valueOf(fromLocation.getLocationTrayHeight() + "")); + } pathPlanning.setTakeLevel(fromLocation.getLocationStorey()); pathPlanning.setTakeOffsetHeight(offsetHeight); + if (ObjectUtil.isNotEmpty(taskDetailDO.getFromLaneId())) { + pathPlanning.setTakeGroupId("LINE_" + taskDetailDO.getFromLaneId()); + }else { + pathPlanning.setTakeGroupId("POINT_" + taskDetailDO.getFromMapItemId()); + } } - //放是线库 - if (ObjectUtil.isNotEmpty(taskDetailDO.getToLocationId()) - && ObjectUtil.isNotEmpty(taskDetailDO.getToLaneId())) { - - pathPlanning.setReleaseGroupId("LINE_" + taskDetailDO.getToLaneId()); + if (ObjectUtil.isNotEmpty(taskDetailDO.getToLocationId())){ pathPlanning.setReleaseLocationNumber(taskDetailDO.getToLocationNumber()); pathPlanning.setReleasePointId(toLocation.getMapItemId()); - pathPlanning.setReleaseHeight(Double.valueOf(toLocation.getLocationTrayHeight() + "")); + if (ObjectUtil.isNotEmpty(toLocation.getLocationTrayHeight())) { + pathPlanning.setReleaseHeight(Double.valueOf(toLocation.getLocationTrayHeight() + "")); + } pathPlanning.setReleaseLevel(toLocation.getLocationStorey()); pathPlanning.setReleaseOffsetHeight(offsetHeight); - - } else if (ObjectUtil.isNotEmpty(taskDetailDO.getToLocationId()) - && ObjectUtil.isEmpty(taskDetailDO.getToLaneId())) { - //放的是普通点位 - pathPlanning.setReleaseGroupId("POINT_" + taskDetailDO.getToMapItemId()); - pathPlanning.setReleaseLocationNumber(taskDetailDO.getToLocationNumber()); - pathPlanning.setReleasePointId(toLocation.getMapItemId()); - pathPlanning.setReleaseHeight(Double.valueOf(toLocation.getLocationTrayHeight() + "")); - pathPlanning.setReleaseLevel(toLocation.getLocationStorey()); - pathPlanning.setReleaseOffsetHeight(offsetHeight); - + if (ObjectUtil.isNotEmpty(taskDetailDO.getToLaneId())){ + pathPlanning.setReleaseGroupId("LINE_" + taskDetailDO.getToLaneId()); + }else { + pathPlanning.setReleaseGroupId("POINT_" + taskDetailDO.getToMapItemId()); + } } - pathPlanningList.add(pathPlanning); } @@ -554,8 +600,6 @@ public class RobotPathPlanningServiceImpl implements RobotPathPlanningService { List detailDOS = taskDetailDOS.stream() .filter(v -> !laneIds.contains(v.getFromLaneId()) && !laneIds.contains(v.getToLaneId()) - && !RobotTaskTypeEnum.PARK.getType().equals(v.getTaskType()) //停车在充电的任务做 - && !RobotTaskTypeEnum.CHARGE.getType().equals(v.getTaskType()) //停车在充电的任务做 && !mapIds.contains(v.getFromMapItemId()) && !mapIds.contains(v.getToMapItemId())) .collect(Collectors.toList()); @@ -615,6 +659,8 @@ 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())) { + list.add(v); } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailMapper.xml index dbe3b29fc..79f2fc7ee 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskDetailMapper.xml @@ -28,6 +28,7 @@ + @@ -70,6 +71,7 @@ from_location_number, to_location_number, from_map_item_id, + need_lock, to_map_item_id @@ -317,6 +319,19 @@ where id = #{id} + + update + robot_task_detail + set + task_status = '2', + task_stage = '5' + where + id in + + #{id} + + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskMapper.xml index 69c3c054b..024e473e3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotTaskMapper.xml @@ -461,6 +461,19 @@ where id = #{id} + + update + robot_task + set + task_status = '2', + task_stage = '5' + where + id in + + #{id} + +