| | |
| | | import com.zy.asrs.domain.enums.WorkNoType; |
| | | import com.zy.asrs.domain.param.CrnOperatorParam; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.entity.param.TaskCreateParam; |
| | | import com.zy.asrs.mapper.*; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.asrs.utils.*; |
| | |
| | | private CrnController crnController; |
| | | @Autowired |
| | | private BasDevpPositionService basDevpPositionService; |
| | | @Autowired |
| | | private OpenService openService; |
| | | |
| | | @Value("${wms.url}") |
| | | private String wmsUrl; |
| | |
| | | |
| | | CrnSlave crnSlave = new CrnSlave(crn); |
| | | if (Cools.isEmpty(crnProtocol.getLaneNo()) || crnProtocol.getLaneNo()==0){ |
| | | CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机巷道号异常!"); |
| | | continue; |
| | | } |
| | | |
| | |
| | | if (!taskWrks.isEmpty()) { |
| | | continue; |
| | | } |
| | | List<TaskWrkLog> taskWrkLogs = taskWrkLogService.selectList(new EntityWrapper<TaskWrkLog>().eq("CRN_NO",crnProtocol.getLaneNo()).orderBy("COMPLETE_TIME",true)); |
| | | List<TaskWrkLog> taskWrkLogs = taskWrkLogService.selectList(new EntityWrapper<TaskWrkLog>().eq("CRN_NO",crnProtocol.getLaneNo()).orderBy("COMPLETE_TIME",false)); |
| | | if (!taskWrkLogs.isEmpty()) { |
| | | TaskWrkLog taskWrkLog = taskWrkLogs.get(0); |
| | | Date completeTime = taskWrkLog.getCompleteTime(); |
| | | if (completeTime==null){ |
| | | completeTime = taskWrkLog.getCancelTime(); |
| | | boolean signT = false; |
| | | for (TaskWrkLog taskWrkLog : taskWrkLogs){ |
| | | Date completeTime = taskWrkLog.getCompleteTime(); |
| | | if (completeTime==null){ |
| | | completeTime = taskWrkLog.getModiTime(); |
| | | continue; |
| | | } |
| | | long differenceInSeconds = TimeCalculatorUtils.differenceInMilliseconds(completeTime, new Date()); |
| | | if (differenceInSeconds <= 60*2*1000) { |
| | | signT = true; |
| | | break; |
| | | } else { |
| | | signT = false; |
| | | break; |
| | | } |
| | | } |
| | | long differenceInSeconds = TimeCalculatorUtils.differenceInMilliseconds(completeTime, new Date()); |
| | | if (differenceInSeconds <= 60*10*1000) { |
| | | return; |
| | | if (signT){ |
| | | continue; |
| | | } |
| | | } |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | |
| | | crnCommand.setLaneNo(crnProtocol.getLaneNo()); // 堆垛机巷道编号 |
| | | crnCommand.setTaskNo((short)999); // 工作号 |
| | | crnCommand.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式: 库位移转 |
| | | crnCommand.setSourcePosX((short) 0); // 源库位排 |
| | | crnCommand.setSourcePosY((short) 0); // 源库位列 |
| | | crnCommand.setSourcePosZ((short) 0); // 源库位层 |
| | | crnCommand.setTaskMode(CrnTaskModeType.SITE_MOVE); // 任务模式: 站位移转4 |
| | | int row = crnProtocol.getLaneNo() * 2; |
| | | crnCommand.setSourcePosX((short) row); // 源库位排 |
| | | crnCommand.setSourcePosY((short) 1); // 源库位列 |
| | | crnCommand.setSourcePosZ((short) 1); // 源库位层 |
| | | crnCommand.setDestinationPosX((short) row); // 目标库位排 |
| | | crnCommand.setDestinationPosY((short) 1); // 目标库位层 |
| | | crnCommand.setDestinationPosZ((short) 1); // 目标库位列 |
| | |
| | | } |
| | | } |
| | | } catch (Exception e){ |
| | | log.error("堆垛机5分钟无任务则回到源点失败"); |
| | | log.error("堆垛机10分钟无任务则回到源点失败"); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | CrnSlave crn = new CrnSlave(crnSlave); |
| | | if (Cools.isEmpty(crnProtocol.getLaneNo()) || crnProtocol.getLaneNo()==0){ |
| | | CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机巷道号异常!"); |
| | | continue; |
| | | } |
| | | |
| | |
| | | |
| | | // 已经存在吊车执行任务时,则过滤 |
| | | if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) { |
| | | TaskWrk taskWrkNow3 = taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()); |
| | | if (taskWrkNow3.getWrkSts() == 3){ |
| | | try{ |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | | crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 |
| | | crnCommand.setLaneNo(crnProtocol.getLaneNo()); // 堆垛机巷道编号 |
| | | crnCommand.setTaskNo(taskWrkNow3.getWrkNo().shortValue()); // 工作号 |
| | | crnCommand.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 |
| | | crnCommand.setSourcePosX(crnStn.getRow().shortValue()); // 源库位排 |
| | | crnCommand.setSourcePosY(crnStn.getBay().shortValue()); // 源库位列 |
| | | crnCommand.setSourcePosZ(crnStn.getLev().shortValue()); // 源库位层 |
| | | crnCommand.setDestinationPosX(Utils.getRowShort(taskWrkNow3.getTargetPoint())); // 目标库位列 |
| | | int bay1 = Utils.getBayShort(taskWrkNow3.getTargetPoint()) + 1; |
| | | crnCommand.setDestinationPosY((short)bay1); // 目标库位层 |
| | | crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrkNow3.getTargetPoint())); // 目标库位排 |
| | | // crnCommand.setCommand((short) 1); |
| | | try{ |
| | | DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); |
| | | deviceErrorService.addDeviceError("CrnErr", slave.getId(), "巷道号"+crnCommand.getLaneNo()+";堆垛机命令地址补丁重新写入:"+JSON.toJSONString(crnCommand.getNowTask())); |
| | | } catch (Exception e2){ |
| | | } |
| | | if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, crnCommand))) { |
| | | log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); |
| | | devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机命令生成失败"); |
| | | CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "运行命令下发失败"); |
| | | |
| | | throw new CoolException("堆垛机命令生成失败"); |
| | | } |
| | | } catch (Exception eNow3){ |
| | | |
| | | } |
| | | } |
| | | |
| | | devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机存在吊车任务"); |
| | | CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机存在执行中吊车任务"); |
| | | continue; |
| | |
| | | // } |
| | | |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | | crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 |
| | | crnCommand.setLaneNo(crnProtocol.getLaneNo()); // 堆垛机巷道编号 |
| | | crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 |
| | | crnCommand.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 |
| | | crnCommand.setSourcePosX(crnStn.getRow().shortValue()); // 源库位排 |
| | | crnCommand.setSourcePosY(crnStn.getBay().shortValue()); // 源库位列 |
| | | crnCommand.setSourcePosZ(crnStn.getLev().shortValue()); // 源库位层 |
| | | crnCommand.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint())); // 目标库位列 |
| | | CrnCommand crnCommand1 = new CrnCommand(); |
| | | crnCommand1.setCrnNo(slave.getId()); // 堆垛机编号 |
| | | crnCommand1.setLaneNo(crnProtocol.getLaneNo()); // 堆垛机巷道编号 |
| | | crnCommand1.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 |
| | | crnCommand1.setAckFinish((short) 0); // 任务完成确认位 |
| | | crnCommand1.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 |
| | | crnCommand1.setSourcePosX(crnStn.getRow().shortValue()); // 源库位排 |
| | | crnCommand1.setSourcePosY(crnStn.getBay().shortValue()); // 源库位列 |
| | | crnCommand1.setSourcePosZ(crnStn.getLev().shortValue()); // 源库位层 |
| | | crnCommand1.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint())); // 目标库位列 |
| | | int bay1 = Utils.getBayShort(taskWrk.getTargetPoint()) + 1; |
| | | crnCommand.setDestinationPosY((short)bay1); // 目标库位层 |
| | | crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint())); // 目标库位排 |
| | | crnCommand1.setDestinationPosY((short)bay1); // 目标库位层 |
| | | crnCommand1.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint())); // 目标库位排 |
| | | // crnCommand.setCommand((short) 1); |
| | | if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, crnCommand))) { |
| | | log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); |
| | | if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, crnCommand1))) { |
| | | log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand1)); |
| | | devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机命令生成失败"); |
| | | CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "运行命令下发失败"); |
| | | |
| | |
| | | |
| | | // 已经存在吊车执行任务时,则过滤 |
| | | if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) { |
| | | |
| | | TaskWrk taskWrkNow3 = taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()); |
| | | if (taskWrkNow3.getWrkSts() == 12){ |
| | | try{ |
| | | CrnCommand command = new CrnCommand(); |
| | | command.setCrnNo(slave.getId()); // 堆垛机编号 |
| | | command.setLaneNo(crnProtocol.getLaneNo()); // 堆垛机编号 |
| | | command.setTaskNo(taskWrkNow3.getWrkNo().shortValue()); // 工作号 |
| | | command.setAckFinish((short) 0); // 任务完成确认位 |
| | | command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式 |
| | | command.setSourcePosX(Utils.getRowShort(taskWrkNow3.getStartPoint())); // 源库位排 |
| | | int bayS = Utils.getBayShort(taskWrkNow3.getStartPoint()) + 1; |
| | | command.setSourcePosY((short)bayS); // 源库位列 |
| | | command.setSourcePosZ(Utils.getLevShort(taskWrkNow3.getStartPoint())); // 源库位层 |
| | | command.setDestinationPosX(crnStn.getRow().shortValue()); // 目标库位排 |
| | | command.setDestinationPosY(crnStn.getBay().shortValue()); // 目标库位列 |
| | | command.setDestinationPosZ(crnStn.getLev().shortValue()); // 目标库位层 |
| | | // command.setCommand((short) 1); |
| | | try{ |
| | | DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); |
| | | deviceErrorService.addDeviceError("CrnErr", slave.getId(), "巷道号"+command.getLaneNo()+";堆垛机命令地址补丁重新写入:"+JSON.toJSONString(command.getNowTask())); |
| | | } catch (Exception e2){ |
| | | } |
| | | if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command))) { |
| | | log.error("堆垛机命令生成失败,堆垛机号={},巷道={},任务数据={}", slave.getId(), taskWrk.getCrnNo(), JSON.toJSON(command)); |
| | | devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机命令生成失败"); |
| | | CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "运行命令下发失败"); |
| | | throw new CoolException("堆垛机命令生成失败"); |
| | | } |
| | | } catch (Exception eNow3){ |
| | | |
| | | } |
| | | } |
| | | devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机存在吊车任务"); |
| | | CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机存在执行中吊车任务"); |
| | | break; |
| | |
| | | |
| | | // 已经存在吊车执行任务时,则过滤 |
| | | if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) { |
| | | CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机存在执行中吊车任务"); |
| | | continue; |
| | | } |
| | | |
| | |
| | | |
| | | CrnSlave crn = new CrnSlave(crnSlave); |
| | | if (Cools.isEmpty(crnProtocol.getLaneNo()) || crnProtocol.getLaneNo()==0){ |
| | | CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机巷道号异常!"); |
| | | continue; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 堆垛机站出库到出库站 |
| | | */ |
| | | public boolean crnStnDEMOStop2() { |
| | | int signHpMk = 0; |
| | | for (CrnSlave crn : slaveProperties.getCrn()) { |
| | | |
| | | // 获取堆垛机信息 |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); |
| | | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); |
| | | if (crnProtocol == null) { |
| | | continue; |
| | | } |
| | | BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); |
| | | if (basCrnp == null) { |
| | | log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); |
| | | continue; |
| | | } |
| | | |
| | | if (Cools.isEmpty(basCrnp.getHpMk()) || !basCrnp.getHpMk().equals("Y")){ |
| | | signHpMk++; |
| | | } |
| | | } |
| | | if (signHpMk == slaveProperties.getCrn().size()){ |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 堆垛机站出库到出库站 |
| | | */ |
| | | public boolean crnStnDEMOStop3() { |
| | | int selectCount = taskWrkService.selectCount(new EntityWrapper<TaskWrk>().eq("io_type",4)); |
| | | if (selectCount>0) { |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * 演示模式启动 |
| | | */ |
| | | public boolean crnStnDEMOOpen0() { |
| | | for (CrnSlave crn : slaveProperties.getCrn()) { |
| | | |
| | | // 获取堆垛机信息 |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); |
| | | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); |
| | | if (crnProtocol == null) { |
| | | continue; |
| | | } |
| | | BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); |
| | | if (basCrnp == null) { |
| | | log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); |
| | | continue; |
| | | } |
| | | |
| | | if (Cools.isEmpty(basCrnp.getHpMk()) || !basCrnp.getHpMk().equals("Y")){ |
| | | continue; |
| | | } |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * 演示模式启动 |
| | | */ |
| | | public boolean crnStnDEMOOpen1() { |
| | | int selectCount = taskWrkService.selectCount(new EntityWrapper<TaskWrk>()); |
| | | if (selectCount>0) { |
| | | return false; |
| | | } |
| | | for (CrnSlave crn : slaveProperties.getCrn()) { |
| | | |
| | | // 获取堆垛机信息 |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); |
| | | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); |
| | | if (crnProtocol == null) { |
| | | continue; |
| | | } |
| | | BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); |
| | | if (basCrnp == null) { |
| | | log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); |
| | | continue; |
| | | } |
| | | |
| | | if (Cools.isEmpty(basCrnp.getHpMk()) || !basCrnp.getHpMk().equals("Y")){ |
| | | CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "存在其它堆垛机开启演示模式!"); |
| | | continue; |
| | | } |
| | | |
| | | CrnSlave crnSlave = new CrnSlave(crn); |
| | | if (Cools.isEmpty(crnProtocol.getLaneNo()) || crnProtocol.getLaneNo()==0){ |
| | | CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机巷道号异常!"); |
| | | continue; |
| | | } |
| | | |
| | | if (!crn.getId().equals(crnProtocol.getLaneNo())) { |
| | | for (CrnSlave crnOther : slaveProperties.getCrn()) { |
| | | if (crnOther.getId().equals(crnProtocol.getLaneNo())) { |
| | | crnSlave.updateCrnInStn(crnOther); |
| | | } |
| | | } |
| | | } |
| | | for (String locNo : crnProtocol.getLocMastDemoList()){ |
| | | LocMast locMast = locMastService.selectByLocNo(locNo); |
| | | TaskCreateParam taskCreateParam = new TaskCreateParam(crnSlave,locMast); |
| | | openService.taskCreate(taskCreateParam); |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | |
| | | } |