|  |  |  | 
|---|
|  |  |  | import com.zy.asrs.framework.common.Cools; | 
|---|
|  |  |  | import com.zy.asrs.framework.common.R; | 
|---|
|  |  |  | import com.zy.asrs.framework.common.SnowflakeIdWorker; | 
|---|
|  |  |  | import com.zy.asrs.framework.exception.CoolException; | 
|---|
|  |  |  | import com.zy.asrs.wcs.core.action.LiftAction; | 
|---|
|  |  |  | import com.zy.asrs.wcs.core.domain.dto.MatDto; | 
|---|
|  |  |  | import com.zy.asrs.wcs.core.domain.dto.RedisMapDto; | 
|---|
|  |  |  | import com.zy.asrs.wcs.core.domain.dto.StaDto; | 
|---|
|  |  |  | 
|---|
|  |  |  | import com.zy.asrs.wcs.core.entity.*; | 
|---|
|  |  |  | import com.zy.asrs.wcs.core.kernel.AnalyzeService; | 
|---|
|  |  |  | import com.zy.asrs.wcs.core.model.MapNode; | 
|---|
|  |  |  | import com.zy.asrs.wcs.core.model.command.LiftAssignCommand; | 
|---|
|  |  |  | import com.zy.asrs.wcs.core.model.command.LiftCommand; | 
|---|
|  |  |  | import com.zy.asrs.wcs.core.model.enums.*; | 
|---|
|  |  |  | import com.zy.asrs.wcs.core.service.*; | 
|---|
|  |  |  | import com.zy.asrs.wcs.core.utils.OpenUtils; | 
|---|
|  |  |  | 
|---|
|  |  |  | import com.zy.asrs.wcs.rcs.model.command.LedCommand; | 
|---|
|  |  |  | import com.zy.asrs.wcs.rcs.model.enums.ShuttleProtocolStatusType; | 
|---|
|  |  |  | import com.zy.asrs.wcs.rcs.model.enums.SlaveType; | 
|---|
|  |  |  | import com.zy.asrs.wcs.rcs.model.protocol.LiftProtocol; | 
|---|
|  |  |  | import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; | 
|---|
|  |  |  | import com.zy.asrs.wcs.rcs.model.protocol.StaProtocol; | 
|---|
|  |  |  | import com.zy.asrs.wcs.rcs.service.DeviceService; | 
|---|
|  |  |  | import com.zy.asrs.wcs.rcs.thread.BarcodeThread; | 
|---|
|  |  |  | import com.zy.asrs.wcs.rcs.thread.DevpThread; | 
|---|
|  |  |  | import com.zy.asrs.wcs.rcs.thread.LedThread; | 
|---|
|  |  |  | import com.zy.asrs.wcs.rcs.thread.ShuttleThread; | 
|---|
|  |  |  | import com.zy.asrs.wcs.rcs.thread.*; | 
|---|
|  |  |  | import com.zy.asrs.wcs.system.entity.Dict; | 
|---|
|  |  |  | import com.zy.asrs.wcs.system.service.DictService; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  | 
|---|
|  |  |  | private ShuttleChargeStaService shuttleChargeStaService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private OpenUtils openUtils; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private LiftAction liftAction; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 组托 | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 入库-托盘进库 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public synchronized void palletInbound() { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | // 根据输送线plc遍历 | 
|---|
|  |  |  | List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>() | 
|---|
|  |  |  | .eq(Device::getDeviceType, DeviceCtgType.CONVEYOR.val()) | 
|---|
|  |  |  | .eq(Device::getStatus, 1)); | 
|---|
|  |  |  | for (Device devp : list) { | 
|---|
|  |  |  | BasConveyor basConveyor = basConveyorService.getOne(new LambdaQueryWrapper<BasConveyor>().eq(BasConveyor::getDeviceId, devp.getId()).eq(BasConveyor::getHostId, devp.getHostId())); | 
|---|
|  |  |  | // 遍历入库口 | 
|---|
|  |  |  | for (StaDto inSta : JSON.parseArray(basConveyor.getInSta(), StaDto.class)) { | 
|---|
|  |  |  | BasConveyorSta basConveyorSta = basConveyorStaService.selectBySiteNo(inSta.getDeviceStaNo().toString()); | 
|---|
|  |  |  | if(basConveyorSta == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取入库站信息 | 
|---|
|  |  |  | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, devp.getId().intValue()); | 
|---|
|  |  |  | StaProtocol staProtocol = devpThread.getStation().get(inSta.getDeviceStaNo()); | 
|---|
|  |  |  | if (staProtocol == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | staProtocol = staProtocol.clone(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | int workNo = staProtocol.getWorkNo().intValue(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 判断是否满足入库条件 | 
|---|
|  |  |  | if (staProtocol.isAutoing() | 
|---|
|  |  |  | && staProtocol.isLoading() | 
|---|
|  |  |  | && staProtocol.isInEnable() | 
|---|
|  |  |  | && (workNo >= 0) | 
|---|
|  |  |  | && staProtocol.isPakMk() | 
|---|
|  |  |  | ) { | 
|---|
|  |  |  | Object object = redisUtil.get(DeviceRedisConstant.LIFT_PALLET_INBOUND + workNo); | 
|---|
|  |  |  | if (object != null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Task task = taskService.getOne(new LambdaQueryWrapper<Task>() | 
|---|
|  |  |  | .eq(Task::getDestSite, inSta.getDeviceStaNo()) | 
|---|
|  |  |  | .in(Task::getTaskSts, TaskStsType.NEW_INBOUND.sts) | 
|---|
|  |  |  | .eq(Task::getTaskNo, workNo)); | 
|---|
|  |  |  | if (task != null) { | 
|---|
|  |  |  | int lev = Utils.getLev(task.getDestLoc()); | 
|---|
|  |  |  | Integer targetSite = null; | 
|---|
|  |  |  | if (lev == 1) { | 
|---|
|  |  |  | targetSite = 31006; | 
|---|
|  |  |  | }else if (lev == 2) { | 
|---|
|  |  |  | targetSite = 31007; | 
|---|
|  |  |  | }else if (lev == 3) { | 
|---|
|  |  |  | targetSite = 31008; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(targetSite == null) { | 
|---|
|  |  |  | throw new CoolException(lev + "层站点信息不存在"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | StaProtocol staProtocol1 = devpThread.getStation().get(targetSite); | 
|---|
|  |  |  | if (staProtocol1 == null) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (!staProtocol1.isAutoing()) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (staProtocol1.isLoading()) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (staProtocol1.getWorkNo().intValue() != 0) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, inSta.getLiftNo()); | 
|---|
|  |  |  | if (liftThread == null) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | LiftProtocol liftProtocol = liftThread.getStatus(); | 
|---|
|  |  |  | if (liftProtocol == null) { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<LiftCommand> command = liftThread.getPalletInOutCommand(workNo, 1, lev, inSta.getDeviceStaNo(), targetSite, LiftCommandModeType.PALLET_INOUT); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | LiftAssignCommand assignCommand = new LiftAssignCommand(); | 
|---|
|  |  |  | assignCommand.setLiftNo(liftProtocol.getLiftNo()); | 
|---|
|  |  |  | assignCommand.setTaskNo(workNo); | 
|---|
|  |  |  | assignCommand.setDeviceTaskNo(liftThread.generateDeviceTaskNo(workNo, MotionCtgType.LIFT_WITH_GOODS)); | 
|---|
|  |  |  | assignCommand.setCommands(command); | 
|---|
|  |  |  | liftAction.assignWork(liftThread.getDevice(), assignCommand); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | redisUtil.set(DeviceRedisConstant.LIFT_PALLET_INBOUND + workNo, "send", 60 * 60 * 6); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 初始化实时地图 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public synchronized void initRealtimeBasMap() { | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 解析入库工作档 | 
|---|
|  |  |  | public synchronized void analyzeInBoundTask() { | 
|---|
|  |  |  | for (Task task : taskService.selectWaitAnalyzeInBoundTask()) { | 
|---|
|  |  |  | BasConveyorSta basConveyorSta = basConveyorStaService.getOne(new LambdaQueryWrapper<BasConveyorSta>().eq(BasConveyorSta::getSiteNo, task.getDestSite())); | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | // 根据输送线plc遍历 | 
|---|
|  |  |  | List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>() | 
|---|
|  |  |  | .eq(Device::getDeviceType, DeviceCtgType.CONVEYOR.val()) | 
|---|
|  |  |  | .eq(Device::getStatus, 1)); | 
|---|
|  |  |  | for (Device devp : list) { | 
|---|
|  |  |  | BasConveyor basConveyor = basConveyorService.getOne(new LambdaQueryWrapper<BasConveyor>().eq(BasConveyor::getDeviceId, devp.getId()).eq(BasConveyor::getHostId, devp.getHostId())); | 
|---|
|  |  |  | // 遍历入库口 | 
|---|
|  |  |  | for (StaDto inSta : JSON.parseArray(basConveyor.getDeviceInSta(), StaDto.class)) { | 
|---|
|  |  |  | BasConveyorSta basConveyorSta = basConveyorStaService.selectBySiteNo(inSta.getStaNo().toString()); | 
|---|
|  |  |  | if (basConveyorSta == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | BasConveyor basConveyor = basConveyorService.getById(basConveyorSta.getConveyorId()); | 
|---|
|  |  |  | if (basConveyor == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //            DeviceBarcode deviceBarcode = deviceBarcodeService.getById(basConveyorSta.getBarcodeId()); | 
|---|
|  |  |  | //            if (deviceBarcode == null) { | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, Integer.parseInt(deviceBarcode.getDeviceId())); | 
|---|
|  |  |  | //            if (barcodeThread == null) { | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            if (!barcodeThread.getBarcode().equals(task.getZpallet())) { | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | if (Cools.isEmpty(basConveyorSta.getTaskNo())){ | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (!basConveyorSta.getTaskNo().toString().equals(task.getTaskNo())){ | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, basConveyor.getDeviceId().intValue()); | 
|---|
|  |  |  | if (devpThread == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | StaProtocol staProtocol = devpThread.getStation().get(basConveyorSta.getSiteNo()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取入库站信息 | 
|---|
|  |  |  | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, devp.getId().intValue()); | 
|---|
|  |  |  | StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); | 
|---|
|  |  |  | if (staProtocol == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | staProtocol = staProtocol.clone(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (!(staProtocol.isAutoing() | 
|---|
|  |  |  | && staProtocol.isLoading() | 
|---|
|  |  |  | && staProtocol.isInEnable())) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | int workNo = staProtocol.getWorkNo().intValue(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //解析前判断内部目标值是否有物 有工作号 | 
|---|
|  |  |  | StaProtocol staProtocolInside = devpThread.getStation().get(Utils.getStaByLev(Utils.getLev(task.getDestLoc()))); | 
|---|
|  |  |  | if (staProtocolInside == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (staProtocolInside.isLoading() || staProtocolInside.getWorkNo() !=0) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 判断是否满足入库条件 | 
|---|
|  |  |  | if (staProtocol.isAutoing() | 
|---|
|  |  |  | && staProtocol.isInEnable() | 
|---|
|  |  |  | && (workNo >= 0) | 
|---|
|  |  |  | && staProtocol.isPakMk() | 
|---|
|  |  |  | ) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Task task = taskService.getOne(new LambdaQueryWrapper<Task>() | 
|---|
|  |  |  | .eq(Task::getDestSite, inSta.getDeviceStaNo()) | 
|---|
|  |  |  | .in(Task::getTaskSts, TaskStsType.NEW_INBOUND.sts) | 
|---|
|  |  |  | .eq(Task::getTaskNo, workNo)); | 
|---|
|  |  |  | if (task != null) { | 
|---|
|  |  |  | if (Cools.isEmpty(task.getShuttleNo())) { | 
|---|
|  |  |  | //分配小车 | 
|---|
|  |  |  | //搜索空闲车 | 
|---|
|  |  |  | 
|---|
|  |  |  | if (!taskService.updateById(task)) { | 
|---|
|  |  |  | News.error("更新工作档失败!!! [工作号:{}]", task.getTaskNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //        for (Task task : taskService.selectWaitAnalyzeInBoundTask()) { | 
|---|
|  |  |  | //            BasConveyorSta basConveyorSta = basConveyorStaService.getOne(new LambdaQueryWrapper<BasConveyorSta>().eq(BasConveyorSta::getSiteNo, task.getDestSite())); | 
|---|
|  |  |  | //            if (basConveyorSta == null) { | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            BasConveyor basConveyor = basConveyorService.getById(basConveyorSta.getConveyorId()); | 
|---|
|  |  |  | //            if (basConveyor == null) { | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | ////            DeviceBarcode deviceBarcode = deviceBarcodeService.getById(basConveyorSta.getBarcodeId()); | 
|---|
|  |  |  | ////            if (deviceBarcode == null) { | 
|---|
|  |  |  | ////                continue; | 
|---|
|  |  |  | ////            } | 
|---|
|  |  |  | ////            BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, Integer.parseInt(deviceBarcode.getDeviceId())); | 
|---|
|  |  |  | ////            if (barcodeThread == null) { | 
|---|
|  |  |  | ////                continue; | 
|---|
|  |  |  | ////            } | 
|---|
|  |  |  | ////            if (!barcodeThread.getBarcode().equals(task.getZpallet())) { | 
|---|
|  |  |  | ////                continue; | 
|---|
|  |  |  | ////            } | 
|---|
|  |  |  | //            if (Cools.isEmpty(basConveyorSta.getTaskNo())){ | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            if (!basConveyorSta.getTaskNo().toString().equals(task.getTaskNo())){ | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, basConveyor.getDeviceId().intValue()); | 
|---|
|  |  |  | //            if (devpThread == null) { | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            StaProtocol staProtocol = devpThread.getStation().get(basConveyorSta.getSiteNo()); | 
|---|
|  |  |  | //            if (staProtocol == null) { | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            if (!(staProtocol.isAutoing() | 
|---|
|  |  |  | //                    && staProtocol.isLoading() | 
|---|
|  |  |  | //                    && staProtocol.isInEnable())) { | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //            //解析前判断内部目标值是否有物 有工作号 | 
|---|
|  |  |  | //            StaProtocol staProtocolInside = devpThread.getStation().get(Utils.getStaByLev(Utils.getLev(task.getDestLoc()))); | 
|---|
|  |  |  | //            if (staProtocolInside == null) { | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            if (staProtocolInside.isLoading() || staProtocolInside.getWorkNo() !=0) { | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //            if (Cools.isEmpty(task.getShuttleNo())) { | 
|---|
|  |  |  | //                //分配小车 | 
|---|
|  |  |  | //                //搜索空闲车 | 
|---|
|  |  |  | //                ShuttleThread shuttleThread = shuttleDispatcher.searchIdleShuttle(task); | 
|---|
|  |  |  | //                if (shuttleThread == null) { | 
|---|
|  |  |  | //                    News.info("{}任务未找到空闲穿梭车", task.getTaskNo()); | 
|---|
|  |  |  | //                    continue; | 
|---|
|  |  |  | //                } | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //                task.setShuttleNo(Integer.valueOf(shuttleThread.getDevice().getDeviceNo()));//保存穿梭车号 | 
|---|
|  |  |  | //                task.setUpdateTime(new Date()); | 
|---|
|  |  |  | //                if (!taskService.updateById(task)) { | 
|---|
|  |  |  | //                    News.info("{}任务更新穿梭车号失败", task.getTaskNo()); | 
|---|
|  |  |  | //                } | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //            // generate motion list | 
|---|
|  |  |  | //            List<Motion> motionList = analyzeService.generateMotion(task); | 
|---|
|  |  |  | //            if (motionList.isEmpty()) { | 
|---|
|  |  |  | //                continue; | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //            motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId()); | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //            // 更新工作主档 | 
|---|
|  |  |  | //            task.setTaskSts(TaskStsType.ANALYZE_INBOUND.sts); // 工作状态 | 
|---|
|  |  |  | //            task.setUpdateTime(new Date()); | 
|---|
|  |  |  | //            if (!taskService.updateById(task)) { | 
|---|
|  |  |  | //                News.error("更新工作档失败!!! [工作号:{}]", task.getTaskNo()); | 
|---|
|  |  |  | //            } | 
|---|
|  |  |  | //        } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|