diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotInformationMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotInformationMapper.java index 39287d700..275232677 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotInformationMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/robot/RobotInformationMapper.java @@ -32,11 +32,6 @@ public interface RobotInformationMapper extends BaseMapperX .orderByDesc(RobotInformationDO::getId)); } - /** - * 查询空闲的机器人 - * @return - */ - List selectFreeRobot(); /** * 更新机器人状态 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 a751acb25..165e82d6b 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 @@ -169,10 +169,11 @@ public class RobotTaskServiceImpl implements RobotTaskService { // todo 更新数据库顺序 后续改为xxl-job一致 //查找库位 + List locationIds = new ArrayList<>(); if (MoveAllEnum.NO.getType().equals(createReqVO.getDoMoveAll())) { - setSingleLocationIdNo(createReqVO.getTaskDetailList(),task); + locationIds = setSingleLocationIdNo(createReqVO.getTaskDetailList(),task); } else { - setAllLocationIdNo(createReqVO,task.getId()); + locationIds = setAllLocationIdNo(createReqVO,task.getId()); } // 插入 @@ -182,6 +183,11 @@ public class RobotTaskServiceImpl implements RobotTaskService { }); robotTaskDetailService.insertRobotDetailList(createReqVO.getTaskDetailList()); + List> fromPartition = Lists.partition(locationIds, 100); + fromPartition.forEach(list-> { + locationMapper.updateLocationLockList(list,task.getId(),LocationLockEnum.NO.getType()); + }); + return RESULT; } @@ -191,7 +197,7 @@ public class RobotTaskServiceImpl implements RobotTaskService { * @param taskId */ @Transactional(rollbackFor = Exception.class) - public void setAllLocationIdNo(RobotTaskSaveReqVO createReqVO, Long taskId) { + public List setAllLocationIdNo(RobotTaskSaveReqVO createReqVO, Long taskId) { List taskDetailList = createReqVO.getTaskDetailList(); List newTaskDetailList = new ArrayList<>(); @@ -268,17 +274,11 @@ public class RobotTaskServiceImpl implements RobotTaskService { } createReqVO.setTaskDetailList(newTaskDetailList); - //跟新库位状态为锁定 - List> toPartition = Lists.partition(toLocationIds, 100); - toPartition.forEach(list-> { - locationMapper.updateLocationLockList(list,taskId,LocationLockEnum.NO.getType()); - }); - - List> fromPartition = Lists.partition(fromLocationIds, 100); - fromPartition.forEach(list-> { - locationMapper.updateLocationLockList(list,taskId,LocationLockEnum.NO.getType()); - }); + if (ObjectUtil.isNotEmpty(fromLocationIds)) { + toLocationIds.addAll(fromLocationIds); + } + return toLocationIds; } /** @@ -324,7 +324,7 @@ public class RobotTaskServiceImpl implements RobotTaskService { * @return */ @Transactional(rollbackFor = Exception.class) - public void setSingleLocationIdNo(List taskDetailList, RobotTaskDO task){ + public List setSingleLocationIdNo(List taskDetailList, RobotTaskDO task){ List locationIds = new ArrayList<>(); for (RobotTaskDetailAddVO robotTaskVo : taskDetailList) { robotTaskVo.setRobotTaskId(task.getId()); @@ -350,16 +350,17 @@ public class RobotTaskServiceImpl implements RobotTaskService { doRelease(robotTaskVo,locationIds); break; case SCAN: - doScan(robotTaskVo); + doScan(robotTaskVo,locationIds); break; case DETECTING_TRAYS: - doDetectingTrays(robotTaskVo); + doDetectingTrays(robotTaskVo,locationIds); break; default : log.error("任务类型不存在 "); throw new RuntimeException("任务类型不存在"); } } + return locationIds; } /** @@ -367,9 +368,9 @@ public class RobotTaskServiceImpl implements RobotTaskService { * @param robotTaskVo */ @Transactional(rollbackFor = Exception.class) - public void doDetectingTrays(RobotTaskDetailAddVO robotTaskVo) { + public void doDetectingTrays(RobotTaskDetailAddVO robotTaskVo, List locationIds) { setToLocation(robotTaskVo,getMapIdsByRobotNo(robotTaskVo.getRobotNo()),new ArrayList<>()); - locationMapper.updateLocationLockStatus(robotTaskVo.getToLocationId(),0,robotTaskVo.getRobotTaskId()); + locationIds.add(robotTaskVo.getToLocationId()); } /** @@ -377,9 +378,9 @@ public class RobotTaskServiceImpl implements RobotTaskService { * @param robotTaskVo */ @Transactional(rollbackFor = Exception.class) - public void doScan(RobotTaskDetailAddVO robotTaskVo) { + public void doScan(RobotTaskDetailAddVO robotTaskVo, List locationIds) { setToLocation(robotTaskVo,getMapIdsByRobotNo(robotTaskVo.getRobotNo()),new ArrayList<>()); - locationMapper.updateLocationLockStatus(robotTaskVo.getToLocationId(),0,robotTaskVo.getRobotTaskId()); + locationIds.add(robotTaskVo.getToLocationId()); } /** @@ -389,7 +390,6 @@ public class RobotTaskServiceImpl implements RobotTaskService { @Transactional(rollbackFor = Exception.class) public void doRelease(RobotTaskDetailAddVO robotTaskVo, List locationIds) { setToLocation(robotTaskVo,getMapIdsByRobotNo(robotTaskVo.getRobotNo()),locationIds); - locationMapper.updateLocationLockStatus(robotTaskVo.getToLocationId(),0,robotTaskVo.getRobotTaskId()); locationIds.add(robotTaskVo.getToLocationId()); } @@ -539,9 +539,6 @@ public class RobotTaskServiceImpl implements RobotTaskService { throw new RuntimeException("取货库位,存在未完成的任务 "); } - //设置为锁定 - locationMapper.updateLocationLockStatus(robotTaskVo.getToLocationId(),0,robotTaskVo.getRobotTaskId()); - locationMapper.updateLocationLockStatus(robotTaskVo.getFromLocationId(),0,robotTaskVo.getRobotTaskId()); } @Override 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 6343b7f32..fb812204f 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 @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.system.service.robot.job; import cn.hutool.core.util.ObjectUtil; +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.task.RobotTaskApi; import cn.iocoder.yudao.module.mqtt.api.task.dto.Pose2ds; @@ -75,7 +76,11 @@ public class DistributeTasksServiceImpl implements DistributeTasksService { @Transactional(rollbackFor = Exception.class) public void distributeTasks() { TenantContextHolder.setTenantId(1L); - List robots = robotInformationMapper.selectFreeRobot(); + List robots = robotInformationMapper.selectList(new LambdaQueryWrapperX() + .eq(RobotInformationDO::getRobotStatus, (RobotStatusEnum.STAND_BY.getType())) + .eq(RobotInformationDO::getRobotTaskModel, RobotTaskModelEnum.NORMAL.getType()) + .orderByDesc(RobotInformationDO::getUpdateTime)); + if (robots.isEmpty()) { log.info("暂无空闲的机器人"); return; @@ -132,6 +137,12 @@ public class DistributeTasksServiceImpl implements DistributeTasksService { @Transactional(rollbackFor = Exception.class) public void distributeTasks(List robots, List taskDetailDOS) { List robotTaskDOS = new ArrayList<>(); + //需要更新的任务明细id + List updateTaskDetails = new ArrayList<>(); + //需要更新的任务id + Set taskIds = new HashSet<>(); + //需要更新的机器人编号 + Set robotNos = new HashSet<>(); for (RobotTaskDetailDO taskDetailDO : taskDetailDOS) { if (ObjectUtil.isEmpty(robots)) { break; @@ -140,7 +151,7 @@ public class DistributeTasksServiceImpl implements DistributeTasksService { RobotTaskTypeEnum robotTaskType = RobotTaskTypeEnum.getRobotTaskType(taskDetailDO.getTaskType()); switch (robotTaskType) { case TAKE_RELEASE: - doTakeReleaseDistribute(taskDetailDO, robots,robotTaskDOS); + doTakeReleaseDistribute(taskDetailDO, robots,robotTaskDOS,taskIds,updateTaskDetails,robotNos); break; /*case PARK: doParkDistribute(taskDetailDO, robots,robotTaskDOS); @@ -172,6 +183,27 @@ public class DistributeTasksServiceImpl implements DistributeTasksService { log.info("任务下发给车机 :{}", JSON.toJSONString(robotTaskDOS)); robotTaskApi.sendTaskToRobot(robotTaskDOS); } + + if (ObjectUtil.isNotEmpty(taskIds)) { + List taskDOS = robotTaskMapper.selectBatchIds(taskIds); + for (RobotTaskDO taskDO : taskDOS) { + if (RobotTaskStatusEnum.NEW.getType().equals(taskDO.getTaskStatus())) { + taskDO.setTaskStatus(RobotTaskStatusEnum.DOING.getType()); + taskDO.setStartTime(LocalDateTime.now()); + } + } + robotTaskMapper.updateBatch(taskDOS); + } + if (ObjectUtil.isNotEmpty(updateTaskDetails)) { + robotTaskDetailMapper.updateBatch(updateTaskDetails); + } + if (ObjectUtil.isNotEmpty(robotNos)) { + List robotInformationDOS = robotInformationMapper.selectByRobotNos(robotNos); + robotInformationDOS.stream().forEach(robotInformationDO -> { + robotInformationDO.setRobotStatus(RobotStatusEnum.DOING.getType()); + }); + robotInformationMapper.updateBatch(robotInformationDOS); + } } /** @@ -346,7 +378,8 @@ public class DistributeTasksServiceImpl implements DistributeTasksService { */ @Transactional(rollbackFor = Exception.class) public void doTakeReleaseDistribute(RobotTaskDetailDO taskDetailDO, List robots, - List robotTaskDOS) { + List robotTaskDOS,Set taskIdSet, + List updateTaskDetail, Set robotNos) { WareHouseLocationDO query = WareHouseLocationDO.builder().id(taskDetailDO.getFromLocationId()).build(); WareHouseLocationDO fromLocation = locationMapper.queryAllByLimit(query); @@ -459,26 +492,6 @@ public class DistributeTasksServiceImpl implements DistributeTasksService { } - /*Pose2ds poseOne = new Pose2ds(); - poseOne.setX(-2.097); - poseOne.setY(-0.325); - poseOne.setYaw(1.571); - Pose2ds poseTwo = new Pose2ds(); - poseTwo.setX(-0.856); - poseTwo.setY(1.622); - poseTwo.setYaw(0.034); - Pose2ds poseThree = new Pose2ds(); - poseThree.setX(1.955); - poseThree.setY(-0.381); - poseThree.setYaw(-1.540); - Pose2ds poseFour = new Pose2ds(); - poseFour.setX(3.046); - poseFour.setY(3.219); - poseFour.setYaw(-3.141); - pose2dsNight.add(poseOne); - pose2dsNight.add(poseTwo); - pose2dsNight.add(poseThree); - pose2dsNight.add(poseFour);*/ taskNigth.setPose2ds(pose2dsNight); //10 @@ -561,7 +574,13 @@ public class DistributeTasksServiceImpl implements DistributeTasksService { final String mac = macAddress; robots.removeIf(v -> v.getMacAddress().equals(mac)); - updateTaskStatus(robotNo,taskDetailDO); + taskDetailDO.setRobotNo(robotNo); + taskDetailDO.setStartTime(LocalDateTime.now()); + taskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType()); + updateTaskDetail.add(taskDetailDO); + + robotNos.add(robotNo); + taskIdSet.add(taskDetailDO.getRobotTaskId()); } private Pair getMadAddressRobotNo(RobotTaskDetailDO taskDetailDO, List robots, @@ -576,7 +595,9 @@ public class DistributeTasksServiceImpl implements DistributeTasksService { .orElse(""); } else { RobotInformationDO robotInformationDO = robots.stream() - .filter(v -> v.getFloorAreaJson().contains(fromLocation.getAreaId()) + .filter(v -> + ObjectUtil.isNotEmpty(v.getMacAddress()) + && v.getFloorAreaJson().contains(fromLocation.getAreaId()) && v.getFloorAreaJson().contains(toLocation.getAreaId())) .findFirst() .orElse(new RobotInformationDO()); @@ -589,18 +610,20 @@ public class DistributeTasksServiceImpl implements DistributeTasksService { @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(String robotNo, RobotTaskDetailDO taskDetailDO) { - robotInformationMapper.updateRobotStatus(robotNo, RobotStatusEnum.DOING.getType()); - RobotTaskDetailDO detailDO = new RobotTaskDetailDO(); - detailDO.setId(taskDetailDO.getId()); - detailDO.setStartTime(LocalDateTime.now()); - detailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType()); - robotTaskDetailMapper.updateRobotDetailById(detailDO); RobotTaskDO robotTaskDO = new RobotTaskDO(); robotTaskDO.setId(taskDetailDO.getRobotTaskId()); robotTaskDO.setStartTime(LocalDateTime.now()); robotTaskDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType()); robotTaskMapper.updateRobot(robotTaskDO); + + RobotTaskDetailDO detailDO = new RobotTaskDetailDO(); + detailDO.setId(taskDetailDO.getId()); + detailDO.setStartTime(LocalDateTime.now()); + detailDO.setTaskStatus(RobotTaskDetailStatusEnum.DOING.getType()); + robotTaskDetailMapper.updateRobotDetailById(detailDO); + + robotInformationMapper.updateRobotStatus(robotNo, RobotStatusEnum.DOING.getType()); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml index 0511b51eb..9b6fbede8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/robot/RobotInformationMapper.xml @@ -271,17 +271,6 @@ where id = #{id} -