diff --git a/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotChangeXYDTO.java b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotChangeXYDTO.java index 565276c74..f01ef7b3e 100644 --- a/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotChangeXYDTO.java +++ b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotChangeXYDTO.java @@ -19,6 +19,7 @@ public class PathToRobotChangeXYDTO { //这个实体类不要修改 private String executionType; private String orderId; + private String timeStamp; private String orderType; private String robotNo; private String taskType; diff --git a/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotDTO.java b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotDTO.java index 17c269b05..4bc36da18 100644 --- a/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotDTO.java +++ b/yudao-module-mqtt/yudao-module-mqtt-api/src/main/java/cn/iocoder/yudao/module/mqtt/api/path/dto/PathToRobotDTO.java @@ -18,6 +18,7 @@ public class PathToRobotDTO { //这个实体类的信息,不能修改 //这个实体类的信息,不能修改 private String orderType; + private String timeStamp; private Integer isCommandEnd; private String robotNo; private String commandType; diff --git a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/RobotStatusServiceImpl.java b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/RobotStatusServiceImpl.java index 2eb8a125b..bcb25c607 100644 --- a/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/RobotStatusServiceImpl.java +++ b/yudao-module-mqtt/yudao-module-mqtt-biz/src/main/java/cn/iododer/yudao/module/mqtt/service/RobotStatusServiceImpl.java @@ -22,7 +22,7 @@ public class RobotStatusServiceImpl implements MqttService { */ @Override public void analysisMessage(String message) { -// log.info("处理RobotStatusServiceImpl的消息 :{}", message); + log.info("处理RobotStatusServiceImpl的消息 :{}", message); RobotPoseStatusDTO robotStatusData = JSON.parseObject(message, RobotPoseStatusDTO.class); robotStatusApi.robotStatusUpdate(robotStatusData); } 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 dc0802077..70de26f1f 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 @@ -126,6 +126,7 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { @Value("${zn.is_simulation:false}") private Boolean isSimulation; + @Transactional(rollbackFor = Exception.class) public void doRobotDoneTask(RobotCompleteTaskDTO robotCompleteTaskDTO) { log.info("111111机器人完成任务上报 :{}", JSON.toJSONString(robotCompleteTaskDTO)); @@ -407,7 +408,9 @@ public class RobotTaskStatusApiImpl implements RobotTaskStatusApi { || RobotTaskStageEnum.UN_START.getType().equals(robotTaskDetailDO.getTaskStage())) { robotTaskDetailDO.setTaskStatus(RobotTaskDetailStatusEnum.NEW.getType()); robotTaskDetailDO.setTaskStage(RobotTaskStageEnum.UN_START.getType()); - robotTaskDetailDO.setRobotNo(""); + if (!isSimulation) { + robotTaskDetailDO.setRobotNo(""); + } robotTaskDetailDO.setOccurError(ZeroOneEnum.ZERO.getType()); robotTaskDetailMapper.updateById(robotTaskDetailDO); String taskNo = taskDetailService.getTaskNoByDetailId(robotCompleteTaskDTO.getOrderId()); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotTaskChcheConstant.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotTaskChcheConstant.java index f15b5c986..99a15f076 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotTaskChcheConstant.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/constant/robot/RobotTaskChcheConstant.java @@ -49,4 +49,7 @@ public class RobotTaskChcheConstant { //机器人物料数量(拼接的是mac地址) public static String ROBOT_TASK_SKU_INFO = "robot:task:sku:info"; + + //所有的车辆信息 获得到一个map, key是 mac,value是具体信息 + public static String ROBOT_ALL_INFORMATION = "robot:all:information"; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/schedul/RcsMapScheduled.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/schedul/RcsMapScheduled.java new file mode 100644 index 000000000..50a033b12 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/schedul/RcsMapScheduled.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.system.schedul; + + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import cn.iocoder.yudao.module.system.api.robot.processor.RequestProcessor; +import cn.iocoder.yudao.module.system.api.robot.websocket.RobotInformationVO; +import cn.iocoder.yudao.module.system.constant.CommonConstant; +import cn.iocoder.yudao.module.system.service.robot.RobotInformationService; +import cn.iocoder.yudao.module.system.util.redis.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@EnableScheduling +@Component +@Slf4j +public class RcsMapScheduled { + + @Resource + private RedisUtil redisUtil; + + @Resource + private RequestProcessor processor; + + @Autowired + private RobotInformationService robotInformationService; + + private static final ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10); + + // 这个方法将每200毫秒执行一次 +// @Scheduled(fixedDelay = 300, timeUnit = TimeUnit.MILLISECONDS) + public void executeTask() { + fixedThreadPool.execute(() ->{ + sendRobotInformationToRcsMap(); + }); + } + + /** + * 发送车辆信息给车机 + */ + private void sendRobotInformationToRcsMap() { + Map robotInformationVOS = robotInformationService.getAllRobotByRedis(); + if (ObjectUtil.isEmpty(robotInformationVOS)) { + return; + } + + for (Map.Entry item : robotInformationVOS.entrySet()) { + RobotInformationVO v = item.getValue(); + if (ObjectUtil.isEmpty(v)) { + v = robotInformationService.getRobotByRedis(item.getKey()); + } + /*processor.handleRequest(floorZoneDTO.getFloor() + CommonConstant.SYMBOL + floorZoneDTO.getArea(), + item.getKey(), JSONUtil.toJsonStr(v));*/ + } + + + } + + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/schedul/ScheduledTasks.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/schedul/ThreeDimensionalScheduled.java similarity index 96% rename from yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/schedul/ScheduledTasks.java rename to yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/schedul/ThreeDimensionalScheduled.java index 0a1f30b37..97d55f92a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/schedul/ScheduledTasks.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/schedul/ThreeDimensionalScheduled.java @@ -14,7 +14,6 @@ import cn.iocoder.yudao.module.system.util.redis.RedisUtil; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -23,12 +22,11 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; @EnableScheduling @Component @Slf4j -public class ScheduledTasks { +public class ThreeDimensionalScheduled { @Resource private PositionMapService positionMapService; 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 78fd2058e..53d94496e 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 @@ -515,7 +515,8 @@ public class PathPlanningServiceImpl implements PathPlanningService { BigDecimal y = (sino.multiply(robotXOffset, MathContext.DECIMAL32)).add(coso.multiply(robotYOffset, MathContext.DECIMAL32)).add(y1); cargoPose.setX(x.doubleValue()); cargoPose.setY(y.doubleValue()); - log.info("转换后 :{}",JSON.toJSONString(pathToRobotChangeXY)); + log.info("111111转换前数据 :{}",message); + log.info("111111转换后 :{}",JSON.toJSONString(pathToRobotChangeXY)); commonApi.commonMethodStr(JSON.toJSONString(pathToRobotChangeXY), topic); } 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 1a482e6c5..0ad5cc38e 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 @@ -162,7 +162,7 @@ public class RobotInformationServiceImpl extends ServiceImpl laneIds = new ArrayList<>(); + List areaIds = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(task.getSkuInfo()) && checkSkuInfo) { + List wareHouseLaneDOS = houseLaneMapper.selectList(new LambdaQueryWrapper() + .eq(WareHouseLaneDO::getLaneMsg, task.getSkuInfo())); + if (ObjectUtil.isNotEmpty(wareHouseLaneDOS)) { + laneIds = wareHouseLaneDOS.stream().map(WareHouseLaneDO::getId).collect(Collectors.toList()); + } + List houseAreaDOS = houseAreaMapper.selectList(new LambdaQueryWrapper() + .eq(HouseAreaDO::getSkuInfo, task.getSkuInfo())); + if (ObjectUtil.isNotEmpty(houseAreaDOS)) { + areaIds = houseAreaDOS.stream().map(HouseAreaDO::getId).collect(Collectors.toList()); + } + } + + //查找库位 + List locationIds = new ArrayList<>(); + if (MoveAllEnum.NO.getType().equals(createReqVO.getDoMoveAll())) { + locationIds = setSingleLocationIdNo(createReqVO.getTaskDetailList(), task, laneIds, areaIds); + } else { + locationIds = setAllLocationIdNo(createReqVO, task.getId(), laneIds, areaIds, task.getSkuInfo()); + } + + // 插入 + createReqVO.getTaskDetailList() + .forEach(taskDetail -> { + taskDetail.setRobotTaskId(task.getId()); + }); + robotTaskDetailService.insertRobotDetailList(createReqVO.getTaskDetailList()); + + List> fromPartition = Lists.partition(locationIds, 100); + fromPartition.forEach(list -> { + locationMapper.updateLocationLockList(list, task.getId(), LocationLockEnum.NO.getType()); + }); + + } + + @Transactional(rollbackFor = Exception.class) + public List setSingleLocationIdNo(List taskDetailList, RobotTaskDO task, + List laneIds, List areaIds) { + //取货中的map_item_id, 此集合不能执行放货的任务 + List takeMapItemIds = taskDetailMapper.selectTakeMapItemIds(); + if (ObjectUtil.isEmpty(takeMapItemIds)) { + takeMapItemIds = new ArrayList<>(); + } + //放货中的map_item_id, 此集合不能执行取货的任务 + List releaseMapItemIds = taskDetailMapper.selectReleaseMapItemIds(); + if (ObjectUtil.isEmpty(releaseMapItemIds)) { + releaseMapItemIds = new ArrayList<>(); + } + + List locationIds = new ArrayList<>(); + Set chooseLocationIds = new HashSet<>(); + + for (RobotTaskDetailAddVO robotTaskVo : taskDetailList) { + robotTaskVo.setRobotTaskId(task.getId()); + robotTaskVo.setPriority(task.getPriority()); + RobotTaskTypeEnum robotTaskType = RobotTaskTypeEnum.getRobotTaskType(robotTaskVo.getTaskType()); + switch (robotTaskType) { + case TAKE_RELEASE: + doTakeRelease(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds, laneIds, areaIds, task.getSkuInfo(), chooseLocationIds); + break; + case PARK: + doPark(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds); + break; + case CHARGE: + doCharge(robotTaskVo, takeMapItemIds, releaseMapItemIds); + break; + case MOVE: + doMove(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds); + break; + case TAKE: + doTake(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds, chooseLocationIds); + break; + case RELEASE: + doRelease(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds, laneIds, areaIds, task.getSkuInfo(), chooseLocationIds); + break; + case SCAN: + //暂无此功能 + doScan(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds); + break; + case DETECTING_TRAYS: + //暂无此功能 + doDetectingTrays(robotTaskVo, locationIds, takeMapItemIds, releaseMapItemIds); + break; + case MOVE_TO_POINT: + doMoveToPoint(robotTaskVo); + break; + default: + log.error("任务类型不存在 "); + throw exception0(TASK_CREATE_FAIL.getCode(), "任务类型不存在"); + } + } + return locationIds; + } + + + public void doTakeRelease(RobotTaskDetailAddVO robotTaskVo, List locationIds, + List takeMapItemIds, List releaseMapItemIds, + List laneIds, List areaIds, String skuInfo, Set chooseLocationIds) { + + + //校验放货库位 + setToLocation(robotTaskVo, null, locationIds, takeMapItemIds, releaseMapItemIds, laneIds, areaIds, skuInfo, chooseLocationIds); + locationIds.add(robotTaskVo.getToLocationId()); + + //校验取货库位 + setFromLocation(robotTaskVo, null, locationIds, takeMapItemIds, releaseMapItemIds, chooseLocationIds); + locationIds.add(robotTaskVo.getFromLocationId()); + + //验证取货库位是否存在未完成的任务 + Set set = new HashSet<>(); + set.add(robotTaskVo.getFromLocationId()); + } + + /** + * 移动到指定点位 + * + * @param robotTaskVo + */ + private void doMoveToPoint(RobotTaskDetailAddVO robotTaskVo) { + PositionMapItemDO positionMapItem = positionMapItemService.getPositionMapItem(robotTaskVo.getReleaseId()); + robotTaskVo.setToLocationNo(String.valueOf(positionMapItem.getSortNum())); + } + + /** + * 检测托盘类型 + * + * @param robotTaskVo + */ + @Transactional(rollbackFor = Exception.class) + public void doDetectingTrays(RobotTaskDetailAddVO robotTaskVo, List locationIds, List takeMapItemIds, + List releaseMapItemIds) { + /*setToLocation(robotTaskVo,getMapIdsByRobotNo(robotTaskVo.getRobotNo()),new ArrayList<>()); + locationIds.add(robotTaskVo.getToLocationId());*/ + } + + /** + * 扫描码 + * + * @param robotTaskVo + */ + @Transactional(rollbackFor = Exception.class) + public void doScan(RobotTaskDetailAddVO robotTaskVo, List locationIds, List takeMapItemIds, + List releaseMapItemIds) { + /*setToLocation(robotTaskVo,getMapIdsByRobotNo(robotTaskVo.getRobotNo()),new ArrayList<>()); + locationIds.add(robotTaskVo.getToLocationId());*/ + } + + /** + * 仅放货 + * + * @param robotTaskVo + */ + @Transactional(rollbackFor = Exception.class) + public void doRelease(RobotTaskDetailAddVO robotTaskVo, List locationIds, List takeMapItemIds, + List releaseMapItemIds, List laneIds, List areaIds, String skuInfo, + Set chooseLocationIds) { + setToLocation(robotTaskVo, null, locationIds, takeMapItemIds, + releaseMapItemIds, laneIds, areaIds, skuInfo, chooseLocationIds); + locationIds.add(robotTaskVo.getToLocationId()); + } + + public void setFromLocation(RobotTaskDetailAddVO robotTaskVo, Set mapIds, List locationIds, + List takeMapItemIds, List releaseMapItemIds, Set chooseLocationIds) { + if (ReleaseTakeEnum.TO_LOCATION.getType().equals(robotTaskVo.getTakeType())) { + WareHouseLocationDO query = WareHouseLocationDO.builder().id(robotTaskVo.getTakeId()).build(); + WareHouseLocationDO locationDO = locationMapper.queryAllByLimit(query); + robotTaskVo.setFromLocationNo(locationDO.getLocationNo()); + robotTaskVo.setFromLocationId(robotTaskVo.getTakeId()); + robotTaskVo.setFromLocationStorey(locationDO.getLocationStorey()); + robotTaskVo.setFromLaneId(locationDO.getLaneId()); + robotTaskVo.setFromLocationNumber(locationDO.getLocationNumber()); + robotTaskVo.setFromMapItemId(locationDO.getMapItemId()); + takeMapItemIds.add(locationDO.getMapItemId()); + } else { + WareHouseLocationDO wareHouseLocationDO = + locationMapper.selectByTypeAndId(LocationUseStatusEnum.YES.getType(), robotTaskVo.getTakeType(), + robotTaskVo.getTakeId(), locationIds, null, releaseMapItemIds, new ArrayList<>(), new ArrayList<>()); + robotTaskVo.setFromLocationNo(wareHouseLocationDO.getLocationNo()); + robotTaskVo.setFromLocationId(wareHouseLocationDO.getId()); + robotTaskVo.setFromLocationStorey(wareHouseLocationDO.getLocationStorey()); + robotTaskVo.setFromLaneId(wareHouseLocationDO.getLaneId()); + robotTaskVo.setFromLocationNumber(wareHouseLocationDO.getLocationNumber()); + robotTaskVo.setFromMapItemId(wareHouseLocationDO.getMapItemId()); + takeMapItemIds.add(wareHouseLocationDO.getMapItemId()); + } + } + + /** + * 仅取货 + * + * @param robotTaskVo + */ + @Transactional(rollbackFor = Exception.class) + public void doTake(RobotTaskDetailAddVO robotTaskVo, List locationIds, List takeMapItemIds, + List releaseMapItemIds, Set chooseLocationIds) { + + setFromLocation(robotTaskVo, null, locationIds, takeMapItemIds, releaseMapItemIds, chooseLocationIds); + locationIds.add(robotTaskVo.getFromLocationId()); + } + + public Set getMapIdsByRobotNo(String robotNo) { + if (ObjectUtil.isNotEmpty(robotNo)) { + RobotInformationPageReqVO pageReqVO = new RobotInformationPageReqVO(); + pageReqVO.setRobotNo(robotNo); + return informationMapper.selectPage(pageReqVO).getList() + .stream() + .findFirst() + .map(RobotInformationDO::getFloorAreaJson) + .orElse(new HashSet<>()); + } + return new HashSet<>(); + } + + /** + * 移动 + * + * @param robotTaskVo + */ + @Transactional(rollbackFor = Exception.class) + public void doMove(RobotTaskDetailAddVO robotTaskVo, List locationIds, List takeMapItemIds, + List releaseMapItemIds) { + setToLocation(robotTaskVo, null, locationIds, takeMapItemIds, releaseMapItemIds, + null, null, null, null); + locationIds.add(robotTaskVo.getToLocationId()); + } + + /** + * 充电 + * + * @param robotTaskVo + */ + @Transactional(rollbackFor = Exception.class) + public void doCharge(RobotTaskDetailAddVO robotTaskVo, List takeMapItemIds, + List releaseMapItemIds) { + + } + + /** + * 停车 + * + * @param robotTaskVo + */ + @Transactional(rollbackFor = Exception.class) + public void doPark(RobotTaskDetailAddVO robotTaskVo, List locationIds, List takeMapItemIds, + List releaseMapItemIds) { + // todo 停车后续停到等待点 + /*setToLocation(robotTaskVo,getMapIdsByRobotNo(robotTaskVo.getRobotNo()),locationIds); + locationIds.add(robotTaskVo.getToLocationId());*/ + } + + + /** + * 设置放货和取货的id + * + * @param createReqVO + * @param taskId + */ + @Transactional(rollbackFor = Exception.class) + public List setAllLocationIdNo(RobotTaskSaveReqVO createReqVO, Long taskId, + List laneIds, List areaIds, String skuInfo) { + List taskDetailList = createReqVO.getTaskDetailList(); + + List newTaskDetailList = new ArrayList<>(); + List mapItemIds = new ArrayList<>(); + + //被此次任务锁定的空库位id + List toLocationIds = new ArrayList<>(); + //被此次任务锁定的有货库位id + List fromLocationIds = new ArrayList<>(); + for (RobotTaskDetailAddVO robotTaskVo : taskDetailList) { + Set mapIds = new HashSet<>(); + + //查找有货且非锁定的库位 + WareHouseLocationDO query = null; + if (ReleaseTakeEnum.TO_LANE.getType().equals(robotTaskVo.getTakeType())) { + query = WareHouseLocationDO.builder() + .laneId(robotTaskVo.getTakeId()) + .build(); + } else if (ReleaseTakeEnum.TO_AREA.getType().equals(robotTaskVo.getTakeType())) { + query = WareHouseLocationDO.builder() + .areaId(robotTaskVo.getTakeId()) + .build(); + } + + List stockList = locationMapper.selectLocations(query, toLocationIds, mapIds, + new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + if (ObjectUtil.isEmpty(stockList)) { + log.error("取货线库/区域为空或者已锁定或者机器人取放货区域受限制 :{}", robotTaskVo.toString()); + throw exception0(TASK_CREATE_FAIL.getCode(), "取货线库/区域为空或者已锁定或者机器人取放货区域受限制"); + } + + //查找空库位 + WareHouseLocationDO releaseQuery = null; + if (ReleaseTakeEnum.TO_LANE.getType().equals(robotTaskVo.getReleaseType())) { + releaseQuery = WareHouseLocationDO.builder() + .laneId(robotTaskVo.getReleaseId()) + .build(); + } else if (ReleaseTakeEnum.TO_AREA.getType().equals(robotTaskVo.getReleaseType())) { + releaseQuery = WareHouseLocationDO.builder() + .areaId(robotTaskVo.getReleaseId()) + .build(); + } + + List releaseStockList = locationMapper.selectLocations(releaseQuery, toLocationIds, mapIds, + laneIds, areaIds, mapItemIds); + if (ObjectUtil.isEmpty(releaseStockList) || releaseStockList.size() < stockList.size()) { + log.error("放货线库/区域库位数量不足或者机器人取放货区域受限制 :{}", robotTaskVo.toString()); + throw exception0(TASK_CREATE_FAIL.getCode(), "放货线库/区域库位数量不足或者机器人取放货区域受限制"); + } + Collections.reverse(releaseStockList); + //赋值数据 + List addTaskDetailList = getTaskDatail(stockList, releaseStockList, toLocationIds, + robotTaskVo, taskId, fromLocationIds); + newTaskDetailList.addAll(addTaskDetailList); + + } + createReqVO.setTaskDetailList(newTaskDetailList); + + if (ObjectUtil.isNotEmpty(fromLocationIds)) { + toLocationIds.addAll(fromLocationIds); + } + return toLocationIds; + } + + private List getTaskDatail(List stockList, + List releaseStockList, + List toLocationIds, RobotTaskDetailAddVO robotTaskVo, + Long taskId, List fromLocationIds) { + List addTaskDetailList = new ArrayList<>(); + for (int i = 0; i < stockList.size(); i++) { + RobotTaskDetailAddVO robotTaskDetailAddVo = new RobotTaskDetailAddVO(); + robotTaskDetailAddVo.setTaskType(robotTaskVo.getTaskType()); + robotTaskDetailAddVo.setReleaseType(robotTaskVo.getReleaseType()); + robotTaskDetailAddVo.setTakeType(robotTaskVo.getTakeType()); + robotTaskDetailAddVo.setTakeId(robotTaskVo.getTakeId()); + robotTaskDetailAddVo.setReleaseId(robotTaskVo.getReleaseId()); + robotTaskDetailAddVo.setRobotNo(robotTaskVo.getRobotNo()); + robotTaskDetailAddVo.setFromLocationNo(stockList.get(i).getLocationNo()); + robotTaskDetailAddVo.setFromLocationId(stockList.get(i).getId()); + robotTaskDetailAddVo.setToLocationNo(releaseStockList.get(i).getLocationNo()); + robotTaskDetailAddVo.setToLocationId(releaseStockList.get(i).getId()); + robotTaskDetailAddVo.setFromLaneId(stockList.get(i).getLaneId()); + robotTaskDetailAddVo.setToLaneId(releaseStockList.get(i).getLaneId()); + robotTaskDetailAddVo.setFromLocationNumber(stockList.get(i).getLocationNumber()); + robotTaskDetailAddVo.setFromMapItemId(stockList.get(i).getMapItemId()); + robotTaskDetailAddVo.setToMapItemId(releaseStockList.get(i).getMapItemId()); + robotTaskDetailAddVo.setRobotTaskId(taskId); + robotTaskDetailAddVo.setPriority(robotTaskVo.getPriority()); + robotTaskDetailAddVo.setFromLocationStorey(stockList.get(i).getLocationStorey()); + robotTaskDetailAddVo.setToLocationStorey(releaseStockList.get(i).getLocationStorey()); + addTaskDetailList.add(robotTaskDetailAddVo); + + toLocationIds.add(releaseStockList.get(i).getId()); + fromLocationIds.add(stockList.get(i).getId()); + } + return addTaskDetailList; + } + + public void setToLocation(RobotTaskDetailAddVO robotTaskVo, Set mapIds, List locationIds, + List takeMapItemIds, List releaseMapItemIds, + List laneIds, List areaIds, String skuInfo, Set chooseLocationIds) { + if (ReleaseTakeEnum.TO_LOCATION.getType().equals(robotTaskVo.getReleaseType())) { + WareHouseLocationDO query = WareHouseLocationDO.builder().id(robotTaskVo.getReleaseId()).build(); + WareHouseLocationDO locationDO = locationMapper.queryAllByLimit(query); + robotTaskVo.setToLocationNo(locationDO.getLocationNo()); + robotTaskVo.setToLocationId(robotTaskVo.getReleaseId()); + robotTaskVo.setToLocationStorey(locationDO.getLocationStorey()); + robotTaskVo.setToLaneId(locationDO.getLaneId()); + robotTaskVo.setToLocationNumber(locationDO.getLocationNumber()); + robotTaskVo.setToMapItemId(locationDO.getMapItemId()); + releaseMapItemIds.add(locationDO.getMapItemId()); + } else { + WareHouseLocationDO wareHouseLocationDO = + locationMapper.selectByTypeAndId(LocationUseStatusEnum.NO.getType(), robotTaskVo.getReleaseType() + , robotTaskVo.getReleaseId(), locationIds, null, takeMapItemIds, laneIds, areaIds); + robotTaskVo.setToLocationNo(wareHouseLocationDO.getLocationNo()); + robotTaskVo.setToLocationId(wareHouseLocationDO.getId()); + robotTaskVo.setToLocationStorey(wareHouseLocationDO.getLocationStorey()); + robotTaskVo.setToLaneId(wareHouseLocationDO.getLaneId()); + robotTaskVo.setToLocationNumber(wareHouseLocationDO.getLocationNumber()); + robotTaskVo.setToMapItemId(wareHouseLocationDO.getMapItemId()); + releaseMapItemIds.add(wareHouseLocationDO.getMapItemId()); + } + } + + +} 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 c999a6167..9ceb11acb 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 @@ -213,6 +213,7 @@ zn: send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位 restore_task_restart: false # 恢复任务是否全部重新执行 true:全部重新开始 synchronous_all_map_node: 500 # 点位信息每次发送的数据量 + task_not_check: true # 创建任务不校验 #海康威视的相关配置 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 749253bde..f10ee789e 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 @@ -248,6 +248,7 @@ zn: send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位 restore_task_restart: true # 恢复任务是否全部重新执行 true:全部重新开始 synchronous_all_map_node: 500 # 点位信息每次发送的数据量 + task_not_check: 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 2a33e2148..bd15da9ff 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 @@ -241,6 +241,7 @@ zn: send_robot_init_pose: true # 是否为发送默认的车辆所在地图和点位 restore_task_restart: false # 恢复任务是否全部重新执行 true:全部重新开始 synchronous_all_map_node: 500 # 点位信息每次发送的数据量 + task_not_check: true # 创建任务不校验 #海康威视的相关配置 isc: