| | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.common.Cools; |
| | | import com.core.common.SpringUtils; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.controller.CrnController; |
| | | import com.zy.asrs.domain.enums.TaskStatusType; |
| | |
| | | private Long avoidDistance; |
| | | @Autowired |
| | | private TaskWrkLogServiceImpl taskWrkLogService; |
| | | @Autowired |
| | | private BasPlcerrorLogServiceImpl basPlcerrorLogService; |
| | | public Long currentTimeMilliConnectCrnAuto= 0L; |
| | | |
| | | public void generateStoreWrkFile() { |
| | | try { |
| | |
| | | TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode", barcode)); |
| | | if (!Cools.isEmpty(taskWrk1)) { |
| | | log.info("托盘码:" + barcode + "任务档存在"); |
| | | if (taskWrk1.getIoType() == 1 && taskWrk1.getStatus() < 3 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())) { |
| | | if (taskWrk1.getIoType() == 1 && taskWrk1.getStatus() < 3 && (taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString()) || taskWrk1.getStartPoint().equals(String.valueOf((staProtocol.getSiteId()+1))))) { |
| | | StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() |
| | | .eq("CRN_NO", taskWrk1.getCrnNo()).eq("TYPE_NO", 1).eq("STN_NO", staProtocol.getSiteId())); |
| | | |
| | |
| | | log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); |
| | | continue; |
| | | } |
| | | |
| | | if (crnProtocol.getLaneNo()!=0 && (crnProtocol.getBay()!=1 || crnProtocol.getLevel()!=1)){ |
| | | if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.statusType == CrnStatusType.IDLE && crnProtocol.getTaskNo() != 0) { |
| | | if (System.currentTimeMillis()-currentTimeMilliConnectCrnAuto<1000*60*10){ |
| | | continue; |
| | | } |
| | | if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.statusType == CrnStatusType.IDLE && crnProtocol.getLoaded().equals((short)0) && crnProtocol.getLaneNo()!=0 && crnProtocol.getTaskNo() == 0 ) { |
| | | if (crnProtocol.getBay()!=1 || crnProtocol.getLevel()!=1){ |
| | | //获取工作档 |
| | | List<TaskWrk> taskWrks = taskWrkMapper.selectByLaneNo(crnProtocol.getLaneNo()); |
| | | if (!taskWrks.isEmpty()) { |
| | | continue; |
| | | } |
| | | List<TaskWrkLog> taskWrkLogs = taskWrkLogService.selectList(new EntityWrapper<TaskWrkLog>().eq("CRN_NO",crnProtocol.getLaneNo()).orderBy("COMPLETE_TIME",true)); |
| | | if (taskWrkLogs.isEmpty()) { |
| | | CrnCommand command = new CrnCommand(); |
| | | if (!MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(4, command))) { |
| | | log.error("堆垛机自动回源点失败,堆垛机号={}", crnProtocol.getCrnNo()); |
| | | if (!taskWrkLogs.isEmpty()) { |
| | | TaskWrkLog taskWrkLog = taskWrkLogs.get(0); |
| | | Date completeTime = taskWrkLog.getCompleteTime(); |
| | | if (completeTime==null){ |
| | | completeTime = taskWrkLog.getCancelTime(); |
| | | if (completeTime==null){ |
| | | completeTime = taskWrkLog.getModiTime(); |
| | | } |
| | | } |
| | | long differenceInSeconds = TimeCalculatorUtils.differenceInMilliseconds(completeTime, new Date()); |
| | | if (differenceInSeconds <= 60*10*1000) { |
| | | return; |
| | | } |
| | | } |
| | | // long differenceInSeconds = TimeCalculatorUtils.differenceInMilliseconds(taskWrkLogs.get(0).getCompleteTime(), new Date()); |
| | | // if (differenceInSeconds <= 1000) { |
| | | // return; |
| | | // } |
| | | // 命令下发区 -------------------------------------------------------------------------- |
| | | CrnCommand crnCommand = new CrnCommand(); |
| | | crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 |
| | | crnCommand.setCrnNo(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); // 源库位层 |
| | | int row = crnProtocol.getLaneNo() * 2; |
| | | crnCommand.setDestinationPosX((short) row); // 目标库位排 |
| | | crnCommand.setDestinationPosY((short) 1); // 目标库位层 |
| | | crnCommand.setDestinationPosZ((short) 1); // 目标库位列 |
| | | if (!MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, crnCommand))) { |
| | | log.error("堆垛机自动回源点失败,堆垛机号={}", crnProtocol.getCrnNo()); |
| | | |
| | | if (System.currentTimeMillis()-currentTimeMilliConnectCrnAuto>1000*60*10){ |
| | | try{ |
| | | DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); |
| | | deviceErrorService.addDeviceError("CrnErr", crnProtocol.getCrnNo(), "堆垛机自动回源点失败"); |
| | | } catch (Exception e2){ |
| | | } |
| | | if (currentTimeMilliConnectCrnAuto == 0){ |
| | | currentTimeMilliConnectCrnAuto = System.currentTimeMillis()-1000*60*10-1; |
| | | } else { |
| | | currentTimeMilliConnectCrnAuto = System.currentTimeMillis(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } catch (Exception e){ |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 堆垛机异常信息记录 |
| | | */ |
| | | public void recDevErr() { |
| | | Date now = new Date(); |
| | | for (DevpSlave devpSlave : slaveProperties.getDevp()) { |
| | | try{ |
| | | // 获取堆垛机信息 |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devpSlave.getId()); |
| | | Map<Integer, StaProtocol> station = devpThread.getStation(); |
| | | for (StaProtocol staProtocol : station.values()){ |
| | | try{ |
| | | if (staProtocol == null) { |
| | | continue; |
| | | } |
| | | // if (staProtocol.isAutoing()) { |
| | | // // 有任务 |
| | | // if (staProtocol.getWorkNo() != 0) { |
| | | //// BasErrLog latest = basPlcerrorLogService.se(crn.getId(), crnProtocol.getTaskNo().intValue()); |
| | | // // 有异常 |
| | | // if (latest == null) { |
| | | // if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) { |
| | | // TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(crnProtocol.getTaskNo())); |
| | | // if (taskWrk == null) { |
| | | // continue; |
| | | // } |
| | | // BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm().intValue()); |
| | | // String errName = crnError == null ? String.valueOf(crnProtocol.getAlarm()) : crnError.getErrName(); |
| | | // BasErrLog basErrLog = new BasErrLog( |
| | | // null, // 编号 |
| | | // taskWrk.getWrkNo(), // 工作号 |
| | | // now, // 发生时间 |
| | | // null, // 结束时间 |
| | | // taskWrk.getWrkSts().longValue(), // 工作状态 |
| | | // taskWrk.getIoType(), // 入出库类型 |
| | | // crn.getId(), // 堆垛机 |
| | | // null, // plc |
| | | // taskWrk.getTargetPoint(), // 目标库位 |
| | | // 0, // 目标站 |
| | | // 0, // 源站 |
| | | // taskWrk.getStartPoint(), // 源库位 |
| | | // taskWrk.getBarcode(), // 条码 |
| | | // (int) crnProtocol.getAlarm(), // 异常码 |
| | | // errName, // 异常 |
| | | // 1, // 异常情况 |
| | | // taskWrk.getCreateTime(), // 任务时间(接收时间) |
| | | // null, // 添加人员 |
| | | // now, // 修改时间 |
| | | // null, // 修改人员 |
| | | // "任务中异常" // 备注 |
| | | // ); |
| | | // if (!basErrLogService.insert(basErrLog)) { |
| | | // log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); |
| | | // } |
| | | // } |
| | | // } else { |
| | | // // 异常修复 |
| | | // if (crnProtocol.getAlarm() == null || crnProtocol.getAlarm() == 0) { |
| | | // latest.setEndTime(now); |
| | | // latest.setUpdateTime(now); |
| | | // latest.setStatus(2); |
| | | // if (!basErrLogService.updateById(latest)) { |
| | | // log.error("堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); |
| | | // } |
| | | // } |
| | | // } |
| | | // // 无任务 |
| | | // } else { |
| | | // BasErrLog latest = basErrLogService.findLatest(crn.getId()); |
| | | // // 有异常 |
| | | // if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) { |
| | | // // 记录新异常 |
| | | // if (latest == null || (latest.getErrCode() != crnProtocol.getAlarm().intValue())) { |
| | | // BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); |
| | | // String errName = crnError == null ? String.valueOf(crnProtocol.getAlarm()) : crnError.getErrName(); |
| | | // BasErrLog basErrLog = new BasErrLog( |
| | | // null, // 编号 |
| | | // null, // 工作号 |
| | | // now, // 发生时间 |
| | | // null, // 结束时间 |
| | | // null, // 工作状态 |
| | | // null, // 入出库类型 |
| | | // crn.getId(), // 堆垛机 |
| | | // null, // plc |
| | | // null, // 目标库位 |
| | | // null, // 目标站 |
| | | // null, // 源站 |
| | | // null, // 源库位 |
| | | // null, // 条码 |
| | | // (int) crnProtocol.getAlarm(), // 异常码 |
| | | // errName, // 异常 |
| | | // 1, // 异常情况 |
| | | // now, // 添加时间 |
| | | // null, // 添加人员 |
| | | // now, // 修改时间 |
| | | // null, // 修改人员 |
| | | // "无任务异常" // 备注 |
| | | // ); |
| | | // if (!basErrLogService.insert(basErrLog)) { |
| | | // log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); |
| | | // } |
| | | // } |
| | | // // 无异常 |
| | | // } else { |
| | | // // 异常修复 |
| | | // if (latest != null && latest.getStatus() == 1) { |
| | | // latest.setEndTime(now); |
| | | // latest.setUpdateTime(now); |
| | | // latest.setStatus(2); |
| | | // if (!basErrLogService.updateById(latest)) { |
| | | // log.error("堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | } catch (Exception devErr){ |
| | | log.error("输送线站点异常信息记录失败 ===>> [id:{}] [error:{}]", staProtocol.getStaNo(), devErr.getMessage()); |
| | | } |
| | | } |
| | | } catch (Exception e){ |
| | | log.error("输送线异常信息记录失败 ===>> [id:{}] [error:{}]", devpSlave.getId(), e.getMessage()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private TaskWrk createTask(GetWmsDto dto, String barcode) { |
| | | String wcsLocNo = dto.getLocNo(); |
| | | if (Cools.isEmpty(wcsLocNo)) { |
| | |
| | | if (taskWrk != null) { |
| | | Integer stano = staProtocol.getStaNo(); |
| | | if (staProtocol.getSiteId() == 1004 || staProtocol.getSiteId()==1020){ |
| | | |
| | | // 判断是否满足取货条件 |
| | | if (!staProtocol.isLoading()) { |
| | | return null; |
| | | } |
| | | // 尺寸检测异常 |
| | | boolean back = false; |
| | | String errMsg = "-"; |
| | |
| | | } |
| | | return null; |
| | | } |
| | | public boolean deviceDetection(RgvSlave.RgvStn inSta,Integer rgvNo) { |
| | | ArrayList<Integer> arrayList = new ArrayList<Integer>() {{ |
| | | add(1009); |
| | | add(1011); |
| | | add(1012); |
| | | add(1014); |
| | | add(1016); |
| | | }}; |
| | | try{ |
| | | |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, inSta.getDevpPlcId()); |
| | | ArrayList<Integer> listW = new ArrayList<Integer>(); |
| | | ArrayList<Integer> listL = new ArrayList<Integer>(); |
| | | for (Integer staNo : arrayList){ |
| | | StaProtocol staProtocol = devpThread.getStation().get(staNo); |
| | | if (staProtocol == null) { |
| | | RgvErrCache.updateRgvErr(rgvNo,staNo+"站点数据丢失"); |
| | | return false; |
| | | } |
| | | // 判断是否满足取货条件 |
| | | if (staProtocol.getWorkNo() != 0) { |
| | | if (!listW.contains(staProtocol.getWorkNo())) { |
| | | listW.add(staProtocol.getWorkNo()); |
| | | } |
| | | } |
| | | // 判断是否满足取货条件 |
| | | if (staProtocol.isLoading()) { |
| | | if (!listL.contains(staProtocol.getStaNo())) { |
| | | listL.add(staProtocol.getStaNo()); |
| | | } |
| | | } |
| | | } |
| | | if (listW.size()>=3){ |
| | | RgvErrCache.updateRgvErr(rgvNo,"等待1012拣选,防止堵塞"); |
| | | return false; |
| | | } |
| | | if (listL.size()>=3){ |
| | | RgvErrCache.updateRgvErr(rgvNo,"等待1012拣选,防止堵塞"); |
| | | return false; |
| | | } |
| | | } catch (Exception e){ |
| | | RgvErrCache.updateRgvErr(rgvNo,"1012检测异常:"+e.getMessage()); |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | public boolean rgvOtherStatusEnable(RgvSlave slave) { |
| | | RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); |
| | |
| | | if (rgvOtherIDLEOther(rgvSlave)){ |
| | | if (!rgvOtherIDLE(rgvSlave,staList.get(0))){ |
| | | System.out.println("空闲就近跳过==="+rgvSlave.getId()+"==="); |
| | | RgvErrCache.updateRgvErr(rgvSlave.getId(),staList.get(0)+"空闲就近跳过"); |
| | | |
| | | sign=true; |
| | | } |
| | |
| | | if (rgvOtherIDLEOther2(rgvSlave)){ |
| | | if (!rgvOtherIDLE2(rgvSlave,staList.get(0))){ |
| | | System.out.println("运行就近跳过==="+rgvSlave.getId()+"==="); |
| | | RgvErrCache.updateRgvErr(rgvSlave.getId(),staList.get(0)+"运行就近跳过"); |
| | | |
| | | sign=true; |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | } |
| | | RgvErrCache.updateRgvErr(rgvSlave.getId(),"未查询到可执行任务"); |
| | | |
| | | } else { |
| | | //可用区域就近取货 |
| | | //就近排序 |
| | |
| | | if (targetPointConvert == null) { |
| | | return false; |
| | | } |
| | | if (targetPointConvert == 1009){ |
| | | if (!deviceDetection(rgvStn, rgvSlave.getId())){ |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | BasDevpPosition basDevpPositionSou = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStn.getStaNo())); |
| | | BasDevpPosition basDevpPositionEnd = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", targetPointConvert)); |
| | |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("任务生成失败issued1===》异常信息:{}", e.getMessage()); |
| | | RgvErrCache.updateRgvErr(rgvSlave.getId(),rgvStn.getStaNo()+"站点任务生成失败issued1"); |
| | | |
| | | return false; |
| | | } |
| | | |
| | |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("任务生成失败issued2===》异常信息:{}", e.getMessage()); |
| | | RgvErrCache.updateRgvErr(rgvSlave.getId(),rgvStn.getStaNo()+"站点任务生成失败issued2"); |
| | | } |
| | | return true; |
| | | } |