Junjie
2023-06-29 1edc46cc37adb14e30c80c22491d770bfe9214d1
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -53,6 +53,8 @@
    @Autowired
    private WrkMastMapper wrkMastMapper;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private LocMastService locMastService;
@@ -1086,26 +1088,6 @@
                                //未找到路径,等待下一次
                                continue;
                            }
                            //所使用的路径进行临时解锁,用于后续计算
                            NavigateMapData navigateMapData = new NavigateMapData(currentLev);
                            navigateMapData.writeNavigateNodeToRedisMap(assignCommand.getNodes(), false);//所使用的路径进行临时解锁
                            //任务执行完后,小车进入移开提升机口站点位置,以免坠落
                            //搜索一条没有小车的空巷道,并调度小车
                            int distLev = Utils.getLev(liftSiteLocNo);//避让楼层
                            String startLocNo = "180020" + Utils.getLev(liftSiteLocNo);
                            ShuttleAssignCommand moveAssignCommand = Utils.searchEmptyGroupToMoveShuttle(distLev, shuttleThread.getSlave().getId(), shuttleThread, startLocNo);
                            if (moveAssignCommand == null) {//调度小车命令为空
                                continue;
                            }
                            //所使用的路径进行临时解锁,用于后续计算
                            navigateMapData.writeNavigateNodeToRedisMap(moveAssignCommand.getNodes(), false);//所使用的路径进行临时解锁
                            commands.addAll(moveAssignCommand.getCommands());//将避让小车的命令添加
                            List<NavigateNode> nodes = assignCommand.getNodes();//将避让路径添加进节点路径中
                            nodes.addAll(moveAssignCommand.getNodes());//将避让路径添加进节点路径中
                            assignCommand.setNodes(nodes);
                            navigateMapData.writeNavigateNodeToRedisMap(nodes, true);//所使用的路径进行锁定
                            //分配目标库位
                            shuttleProtocol.setLocNo(wrkMast.getSourceLocNo());
@@ -1177,26 +1159,6 @@
                        if (commands == null) {
                            continue;//未找到路径
                        }
                        //所使用的路径进行临时解锁,用于后续计算
                        NavigateMapData navigateMapData = new NavigateMapData(Utils.getLev(liftSiteLocNo));
                        navigateMapData.writeNavigateNodeToRedisMap(assignCommand.getNodes(), false);//所使用的路径进行临时解锁
                        //任务执行完后,小车进入移开提升机口站点位置,以免坠落
                        //搜索一条没有小车的空巷道,并调度小车
                        int distLev = Utils.getLev(liftSiteLocNo);//避让楼层
                        String startLocNo = "180020" + Utils.getLev(liftSiteLocNo);
                        ShuttleAssignCommand moveAssignCommand = Utils.searchEmptyGroupToMoveShuttle(distLev, shuttleThread.getSlave().getId(), shuttleThread, startLocNo);
                        if (moveAssignCommand == null) {//调度小车命令为空
                            continue;
                        }
                        //所使用的路径进行临时解锁,用于后续计算
                        navigateMapData.writeNavigateNodeToRedisMap(moveAssignCommand.getNodes(), false);//所使用的路径进行临时解锁
                        commands.addAll(moveAssignCommand.getCommands());//将避让小车的命令添加
                        List<NavigateNode> nodes = assignCommand.getNodes();//将避让路径添加进节点路径中
                        nodes.addAll(moveAssignCommand.getNodes());//将避让路径添加进节点路径中
                        assignCommand.setNodes(nodes);
                        navigateMapData.writeNavigateNodeToRedisMap(nodes, true);//所使用的路径进行锁定
                        //此时车在提升机内部,需要多下达一步指令让车移动到提升机口
                        short startCode = liftProtocol.getBarcode();//提升机内部二维码
@@ -1318,16 +1280,23 @@
            //同一楼层,没有空闲穿梭车,只能从其他楼层调度
            //寻找离任务最近的穿梭车
            for (ShuttleThread shuttleThread : diffLev) {
                if (recentShuttle == null) {//最近穿梭车为空,则默认赋予为最近穿梭车
                    recentShuttle = shuttleThread;
                }
                //当前穿梭车库位号
                String currentLocNo = shuttleThread.getShuttleProtocol().getCurrentLocNo();
                int currentLev = Utils.getLev(currentLocNo);
                List<LocMast> locMasts = wrkMastService.selectNoShuttleWrkByLev(currentLev);//判断当前穿梭车楼层是否有待分配车辆的任务,如果有则不分配这辆车
                if (locMasts.size() > 0) {
                    //存在其他任务,跳过这辆车
                    continue;
                }
                if (recentShuttle == null) {//最近穿梭车为空,则默认赋予为最近穿梭车
                    recentShuttle = shuttleThread;
                }
                //目前最近穿梭车库位号
                String recentLocNo = recentShuttle.getShuttleProtocol().getCurrentLocNo();
                int recentLev = Utils.getLev(recentLocNo);
                //当前最近四向穿梭车到当前车子所在楼层的提升机口距离
                List<NavigateNode> recentShuttlePath = NavigateUtils.calc(recentLocNo, Utils.levToOutInStaLocNo(recentLev), NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleThread.getSlave().getId(), recentLev));//搜索空闲穿梭车,使用正常通道地图
@@ -1371,8 +1340,11 @@
                //标记复位
                shuttleProtocol.setPakMk(true);
                ShuttleAssignCommand assignCommand = shuttleProtocol.getAssignCommand();
                //将任务档标记为完成
                WrkMast wrkMast = wrkMastMapper.selectByWorkNo(shuttleProtocol.getTaskNo().intValue());
                ShuttleAssignCommand moveAssignCommand = null;//避让命令
                if (wrkMast != null) {
                    switch (wrkMast.getWrkSts().intValue()) {
                        case 9://9.小车入库搬运中 ==> 14.入库完成
@@ -1385,6 +1357,15 @@
                            wrkMast.setWrkSts(23L);
                            break;
                        case 26://26.小车出库搬运中 ==> 27.小车出库搬运完成
                            //任务执行完后,小车进入移开提升机口站点位置,以免坠落
                            //搜索一条没有小车的空巷道,并调度小车
                            int distLev = Utils.getLev(wrkMast.getSourceLocNo());//避让楼层
                            String startLocNo = "180020" + distLev;
                            moveAssignCommand = Utils.searchEmptyGroupToMoveShuttle(distLev, shuttleThread.getSlave().getId(), shuttleThread, startLocNo);
                            if (moveAssignCommand == null) {//调度小车命令为空
                                continue;
                            }
                            wrkMast.setWrkSts(27L);
                            break;
                        default:
@@ -1402,8 +1383,34 @@
                        //任务指令清零
                        shuttleProtocol.setAssignCommand(null);
                        News.info("四向穿梭车已确认且任务完成状态,复位。四向穿梭车号={}", shuttleProtocol.getShuttleNo());
                        if (wrkMast.getWrkSts() == 27) {
                            if (moveAssignCommand != null) {
                                //下发任务
                                shuttleProtocol.setPakMk(true);
                                MessageQueue.offer(SlaveType.Shuttle, shuttleThread.getSlave().getId(), new Task(3, moveAssignCommand));
                            }
                        }
                    } else {
                        News.error("四向穿梭车已确认且任务完成状态,复位失败,但未找到工作档。四向穿梭车号={},工作号={}", shuttleProtocol.getShuttleNo(), shuttleProtocol.getTaskNo());
                    }
                }
                if (assignCommand != null) {
                    if (assignCommand.getTaskMode().intValue() == ShuttleTaskModeType.AVOID.id) {
                        //避让任务
                        //设置四向穿梭车为空闲状态
                        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
                        //任务号清零
                        shuttleProtocol.setTaskNo((short) 0);
                        //源库位清零
                        shuttleProtocol.setSourceLocNo(null);
                        //目标库位清零
                        shuttleProtocol.setLocNo(null);
                        //任务指令清零
                        shuttleProtocol.setAssignCommand(null);
                        News.info("四向穿梭车避让任务已确认且任务完成状态,复位。四向穿梭车号={}", shuttleProtocol.getShuttleNo());
                    }
                }
@@ -1765,6 +1772,8 @@
                                throw new CoolException("更新plc站点信息失败");
                            }
                            wrkMast.setWrkSts(4L);
                            //任务号清零
                            liftProtocol.setTaskNo((short) 0);
                            break;
                        case 7://7.提升机迁移小车中 ==> 8.提升机迁移小车完成
                            if (liftProtocol.getLev().intValue() != lev) {
@@ -1784,6 +1793,8 @@
                            }
                            wrkMast.setWrkSts(29L);
                            wrkMast.setWrkSts(34L);//34.出库完成,暂时先直接完成出库工作档,后续需要根据输送线给出的状态来确定34.出库完成状态
                            //任务号清零
                            liftProtocol.setTaskNo((short) 0);
                            break;
                        default:
                    }
@@ -1793,8 +1804,6 @@
                        liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
                        //任务指令清零
                        liftProtocol.setAssignCommand(null);
                        //任务号清零
                        liftProtocol.setTaskNo((short) 0);
                        News.info("提升机已确认且任务完成状态。提升机号={}", liftProtocol.getLiftNo());
                    } else {
                        News.error("提升机已确认且任务完成状态,复位失败,但未找到工作档。提升机号={},工作号={}", liftProtocol.getLiftNo(), liftProtocol.getTaskNo());