|  |  |  | 
|---|
|  |  |  | import org.springframework.transaction.annotation.Transactional; | 
|---|
|  |  |  | import org.springframework.transaction.interceptor.TransactionAspectSupport; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  | import java.util.Date; | 
|---|
|  |  |  | import java.util.List; | 
|---|
|  |  |  | import java.util.Set; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  | import java.util.stream.Collectors; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 库位移转 | 
|---|
|  |  |  | //                this.locToLoc(crn, crnProtocol); | 
|---|
|  |  |  | // 演示 | 
|---|
|  |  |  | this.steMoveDemo(crn, crnProtocol); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | LocMast locMast = locMastService.selectById(locNo); | 
|---|
|  |  |  | int lev = locMast.getLev1(); | 
|---|
|  |  |  | int bay = locMast.getBay1(); | 
|---|
|  |  |  | int levAbs = Math.abs(lev - steProtocol.getLev()); | 
|---|
|  |  |  | int bayAbs = Math.abs(bay - steProtocol.getBay()); | 
|---|
|  |  |  | if (val == 0) { | 
|---|
|  |  |  | val = levAbs + bayAbs; | 
|---|
|  |  |  | result = steThread; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | if ((levAbs + bayAbs) < val) { | 
|---|
|  |  |  | val = levAbs + bayAbs; | 
|---|
|  |  |  | result = steThread; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return result; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public SteThread queryIdleCar(CrnProtocol crnProtocol) { | 
|---|
|  |  |  | List<BasSte> basStes = basSteService.selectList(new EntityWrapper<>()); | 
|---|
|  |  |  | int val = 0; | 
|---|
|  |  |  | SteThread result = null; | 
|---|
|  |  |  | for (BasSte basSte : basStes) { | 
|---|
|  |  |  | // 获取穿梭车信息 | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, basSte.getSteNo()); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (steProtocol == null) { continue; } | 
|---|
|  |  |  | if (!steProtocol.isIdle()) { continue; } | 
|---|
|  |  |  | if (steProtocol.getRow() == 1) { continue;} | 
|---|
|  |  |  | int lev = crnProtocol.getLevel(); | 
|---|
|  |  |  | int bay = crnProtocol.getBay(); | 
|---|
|  |  |  | int levAbs = Math.abs(lev - steProtocol.getLev()); | 
|---|
|  |  |  | int bayAbs = Math.abs(bay - steProtocol.getBay()); | 
|---|
|  |  |  | if (val == 0) { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public List<String> crn2DemoLocs = new ArrayList<String>(); public String crn2LastLoc = ""; | 
|---|
|  |  |  | public synchronized void demo() { | 
|---|
|  |  |  | if (Cools.isEmpty(crn2DemoLocs)) { | 
|---|
|  |  |  | crn2DemoLocs = locMastService.getDemoNextLoc(2); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (CrnSlave crn : slaveProperties.getCrn()) { | 
|---|
|  |  |  | if (!crn.getDemo()) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 必须为演示状态 | 
|---|
|  |  |  | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
|---|
|  |  |  | CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
|---|
|  |  |  | if (crnProtocol == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 只有当堆垛机空闲 并且 无任务时才继续执行 | 
|---|
|  |  |  | if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // filter | 
|---|
|  |  |  | if (wrkChargeService.selectCount(new EntityWrapper<WrkCharge>() | 
|---|
|  |  |  | .eq("crn_no", crn.getId()).between("wrk_sts", 31, 36)) > 0) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | SteThread steThread = queryIdleCar(crnProtocol); | 
|---|
|  |  |  | if (Cools.isEmpty(steThread)) { | 
|---|
|  |  |  | log.warn("没有空闲的小车进行演示功能"); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | int steNo = steThread.getSlave().getId(); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | BasSte basSte = basSteService.selectById(steNo); | 
|---|
|  |  |  | if (Cools.isEmpty(steProtocol, basSte)) { continue; } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 只有当穿梭车空闲 并且 无任务时才继续执行 | 
|---|
|  |  |  | if (steProtocol.isIdle()) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String locNo = null; | 
|---|
|  |  |  | Iterator<String> iterator = crn2DemoLocs.iterator(); | 
|---|
|  |  |  | while (iterator.hasNext()) { | 
|---|
|  |  |  | String next = iterator.next(); | 
|---|
|  |  |  | String lastLoc = crn2LastLoc; | 
|---|
|  |  |  | if (!Cools.isEmpty(lastLoc)) { | 
|---|
|  |  |  | if (!lastLoc.substring(2, 7).equals(next.substring(2, 7)) | 
|---|
|  |  |  | || !Utils.getGroupRow(lastLoc, true).equals(Utils.getGroupRow(next, true))) { | 
|---|
|  |  |  | locNo = next; | 
|---|
|  |  |  | iterator.remove(); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | iterator.remove(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | locNo = next; | 
|---|
|  |  |  | iterator.remove(); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (!Cools.isEmpty(locNo)) { | 
|---|
|  |  |  | crn2LastLoc = locNo; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | log.info("{}号堆垛机对{}库位进行演示", crn.getId(), locNo); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String sourceLocNo = Utils.getLocNo(steProtocol.getRow(), steProtocol.getBay(), steProtocol.getLev()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | WrkCharge wrkCharge = new WrkCharge(); | 
|---|
|  |  |  | wrkCharge.setCrnNo(crn.getId()); | 
|---|
|  |  |  | wrkCharge.setSteNo(steNo); | 
|---|
|  |  |  | wrkCharge.setWrkNo(commonService.getChargeWorkNo(5)); | 
|---|
|  |  |  | wrkCharge.setWrkSts(31L);   // 31.生成演示ID | 
|---|
|  |  |  | wrkCharge.setIoPri((double) 10); | 
|---|
|  |  |  | wrkCharge.setSourceLocNo(sourceLocNo); | 
|---|
|  |  |  | wrkCharge.setLocNo(locNo); | 
|---|
|  |  |  | wrkCharge.setMemo("demo"); | 
|---|
|  |  |  | if (!wrkChargeService.insert(wrkCharge)) { | 
|---|
|  |  |  | log.error("生成演示任务失败,堆垛机号:{},小车:{},源库位:{},目标库位:{}", crn.getId(), steNo, sourceLocNo, locNo); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 演示取货 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private void steMoveDemo(CrnSlave slave, CrnProtocol crnProtocol) { | 
|---|
|  |  |  | // 获取工作档信息 | 
|---|
|  |  |  | WrkCharge wrkCharge = wrkChargeService.selectOne(new EntityWrapper<WrkCharge>().eq("crn_no", slave.getId()) | 
|---|
|  |  |  | .in("wrk_sts", 31, 33, 35)); | 
|---|
|  |  |  | if (null == wrkCharge) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | SteThread steThread = (SteThread) SlaveConnection.get(SlaveType.Ste, wrkCharge.getSteNo()); | 
|---|
|  |  |  | SteProtocol steProtocol = steThread.getSteProtocol(); | 
|---|
|  |  |  | if (null == steProtocol) { return; } | 
|---|
|  |  |  | if (steProtocol.isIdle()) { | 
|---|
|  |  |  | // 31.生成演示ID | 
|---|
|  |  |  | if (wrkCharge.getWrkSts() == 31L) { | 
|---|
|  |  |  | this.letCarBeReady(wrkCharge, steProtocol.getSteNo().intValue()); | 
|---|
|  |  |  | wrkCharge.setWrkSts(32L); | 
|---|
|  |  |  | wrkCharge.setModiTime(new Date()); | 
|---|
|  |  |  | if (!wrkChargeService.updateById(wrkCharge)) { | 
|---|
|  |  |  | log.error("修改演示任务{}工作档 31.生成演示ID ==>> 32.小车走行 失败!", wrkCharge.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 33.小车待搬 | 
|---|
|  |  |  | } else if (wrkCharge.getWrkSts() == 33L) { | 
|---|
|  |  |  | if (steProtocol.isLoading()) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | LocMast locMast = locMastService.selectById(wrkCharge.getLocNo()); | 
|---|
|  |  |  | // 堆垛机命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | CrnCommand crnCommand = new CrnCommand(); | 
|---|
|  |  |  | crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 | 
|---|
|  |  |  | crnCommand.setTaskNo(wrkCharge.getWrkNo().shortValue()); // 工作号 | 
|---|
|  |  |  | crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
|---|
|  |  |  | crnCommand.setTaskMode(CrnTaskModeType.STE_MOVE); // 任务模式:  库位移转 | 
|---|
|  |  |  | crnCommand.setSourcePosX(Utils.getGroupRow(steProtocol.getRow().intValue()).shortValue());     // 源库位排 | 
|---|
|  |  |  | crnCommand.setSourcePosY(steProtocol.getBay());     // 源库位列 | 
|---|
|  |  |  | crnCommand.setSourcePosZ(steProtocol.getLev());     // 源库位层 | 
|---|
|  |  |  | crnCommand.setDestinationPosX(Utils.getGroupRow(locMast.getLocNo()).shortValue());     // 目标库位排 | 
|---|
|  |  |  | crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列 | 
|---|
|  |  |  | crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层 | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Crn, wrkCharge.getCrnNo(), new Task(2, crnCommand))) { | 
|---|
|  |  |  | log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkCharge.getCrnNo(), JSON.toJSON(crnCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改穿梭车运行中排列层 | 
|---|
|  |  |  | steThread.modifyPos(Utils.getGroupRow(locMast.getLocNo()), locMast.getBay1(), locMast.getLev1()); | 
|---|
|  |  |  | // 修改工作档状态 33.小车待搬 => 34.吊车搬运 | 
|---|
|  |  |  | Date now = new Date(); | 
|---|
|  |  |  | wrkCharge.setWrkSts(34L); | 
|---|
|  |  |  | wrkCharge.setCrnStrTime(now); | 
|---|
|  |  |  | wrkCharge.setModiTime(now); | 
|---|
|  |  |  | if (!wrkChargeService.updateById(wrkCharge)) { | 
|---|
|  |  |  | log.error("修改演示任务{}工作档 33.小车待搬 => 34.吊车搬运 失败!", wrkCharge.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 35.小车就绪 | 
|---|
|  |  |  | } else if (wrkCharge.getWrkSts() == 35L) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int steNo = steProtocol.getSteNo().intValue(); | 
|---|
|  |  |  | if (!basSteService.updatePakMk(steNo, "Y")) { | 
|---|
|  |  |  | log.error("修改穿梭车作业状态 失败!!,穿梭车={}", steNo); | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 命令下发区 -------------------------------------------------------------------------- | 
|---|
|  |  |  | SteCommand steCommand = new SteCommand(); | 
|---|
|  |  |  | steCommand.setSteNo(steNo); // 穿梭车编号 | 
|---|
|  |  |  | steCommand.setTaskNo(wrkCharge.getWrkNo()); // 工作号 | 
|---|
|  |  |  | SteTaskModeType originByLoc = SteTaskModeType.findOriginByLoc(steProtocol.getRow()); | 
|---|
|  |  |  | if (originByLoc.equals(SteTaskModeType.GO_ORIGIN)) { | 
|---|
|  |  |  | originByLoc = SteTaskModeType.BACK_ORIGIN; | 
|---|
|  |  |  | } else if (originByLoc.equals(SteTaskModeType.BACK_ORIGIN)) { | 
|---|
|  |  |  | originByLoc = SteTaskModeType.GO_ORIGIN; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | steCommand.setTaskMode(originByLoc); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | steCommand.setRow(Utils.getGroupRow(steProtocol.getRow().intValue()).shortValue()); | 
|---|
|  |  |  | steCommand.setBay(steProtocol.getBay()); | 
|---|
|  |  |  | steCommand.setLev(steProtocol.getLev()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!MessageQueue.offer(SlaveType.Ste, steNo, new Task(2, steCommand))) { | 
|---|
|  |  |  | log.error("穿梭车命令下发失败,穿梭车号={},任务数据={}", steNo, JSON.toJSON(steCommand)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 修改工作档状态 35.小车就绪 => 36.小车走行 | 
|---|
|  |  |  | wrkCharge.setWrkSts(36L); | 
|---|
|  |  |  | wrkCharge.setModiTime(new Date()); | 
|---|
|  |  |  | if (!wrkChargeService.updateById(wrkCharge)) { | 
|---|
|  |  |  | log.error("修改演示任务{}工作档 35.小车就绪 => 36.小车走行 失败!", wrkCharge.getWrkNo()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|