| | |
| | | vo.setLoading(p.getLoaded() != null && p.getLoaded() == 1 ? "æç©" : "æ ç©"); |
| | | vo.setLoadingTwo(p.getLoadedTwo() != null && p.getLoadedTwo() == 1 ? "æç©" : "æ ç©"); |
| | | vo.setBay(p.getBay()); |
| | | vo.setBayTwo(p.getBayTwo()); |
| | | vo.setLev(p.getLevel()); |
| | | vo.setLevTwo(p.getLevelTwo()); |
| | | vo.setForkOffset(p.getForkPosType() == null ? "-" : p.getForkPosType().desc); |
| | | vo.setForkOffsetTwo(p.getForkPosTypeTwo() == null ? "-" : p.getForkPosTypeTwo().desc); |
| | | vo.setLiftPos(p.getLiftPosType() == null ? "-" : p.getLiftPosType().desc); |
| | | vo.setLiftPosTwo(p.getLiftPosTypeTwo() == null ? "-" : p.getLiftPosTypeTwo().desc); |
| | | vo.setWalkPos(p.getWalkPos() != null && p.getWalkPos() == 0 ? "å¨å®ä½" : "ä¸å¨å®ä½"); |
| | | vo.setWalkPosTwo(p.getWalkPosTwo() != null && p.getWalkPosTwo() == 0 ? "å¨å®ä½" : "ä¸å¨å®ä½"); |
| | | vo.setTaskReceive(p.getTaskReceive() != null && p.getTaskReceive() == 1 ? "æ¥æ¶" : "æ ä»»å¡"); |
| | | vo.setTaskReceiveTwo(p.getTaskReceiveTwo() != null && p.getTaskReceiveTwo() == 1 ? "æ¥æ¶" : "æ ä»»å¡"); |
| | | vo.setXspeed(p.getXSpeed()); |
| | |
| | | } |
| | | DualCrnCommand command = crnThread.getMoveCommand(targetLocNo, 9999, crnNo); |
| | | if (station != null) { |
| | | command.setStation(station.shortValue()); |
| | | command.setStation(station); |
| | | } |
| | | MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(3, command)); |
| | | return R.ok(); |
| | |
| | | package com.zy.asrs.controller; |
| | | |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.common.Cools; |
| | | import com.core.common.R; |
| | | import com.zy.asrs.domain.param.*; |
| | | import com.zy.asrs.entity.DeviceConfig; |
| | |
| | | |
| | | @PostMapping("/getAllLocInformation") |
| | | @OpenApiLog(memo = "è·åå
¨é¨åºä½ä¿¡æ¯") |
| | | public R getAllLocInformation() { |
| | | List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()); |
| | | if (locMasts.isEmpty()) { |
| | | return R.error("åºä½ä¿¡æ¯ä¸åå¨"); |
| | | public R getAllLocInformation(@RequestBody GetAllLocInformationParam param) { |
| | | List<HashMap<String, Object>> list = new ArrayList<>(); |
| | | EntityWrapper<LocMast> wrapper = new EntityWrapper<>(); |
| | | |
| | | if (!Cools.isEmpty(param.getRow())) { |
| | | wrapper.eq("row1", param.getRow()); |
| | | } |
| | | |
| | | ArrayList<HashMap<String, Object>> list = new ArrayList<>(); |
| | | if (!Cools.isEmpty(param.getLev())) { |
| | | wrapper.eq("lev1", param.getLev()); |
| | | } |
| | | |
| | | List<LocMast> locMasts = locMastService.selectList(wrapper); |
| | | if (locMasts.isEmpty()) { |
| | | return R.ok().add(list); |
| | | } |
| | | |
| | | for (LocMast locMast : locMasts) { |
| | | HashMap<String, Object> map = new HashMap<>(); |
| | | map.put("locNo", locMast.getLocNo()); |
| | | map.put("locSts", locMast.getLocSts()); |
| | | map.put("barcode", locMast.getBarcode()); |
| | | map.put("row", locMast.getRow1()); |
| | | map.put("bay", locMast.getBay1()); |
| | | map.put("lev", locMast.getLev1()); |
| | | list.add(map); |
| | | } |
| | | |
| | |
| | | @GetMapping("/getFakeSystemRunStatus") |
| | | public R getFakeSystemRunStatus() { |
| | | HashMap<String, Object> map = new HashMap<>(); |
| | | if(mainProcessPlugin.equals("FakeProcess")) { |
| | | if(mainProcessPlugin.contains("Fake")) { |
| | | map.put("running", false); |
| | | map.put("isFake", true); |
| | | Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "enableFake")); |
| New file |
| | |
| | | package com.zy.asrs.domain.param; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class GetAllLocInformationParam { |
| | | |
| | | private Integer row; |
| | | |
| | | private Integer lev; |
| | | |
| | | } |
| | |
| | | |
| | | private String loadingTwo = "-"; |
| | | |
| | | private Integer bay; |
| | | |
| | | private Integer bayTwo; |
| | | |
| | | private Integer lev; |
| | | |
| | | private Integer levTwo; |
| | | |
| | | private String forkOffset = "-"; |
| | | |
| | | private String forkOffsetTwo = "-"; |
| | | |
| | | private String liftPos = "-"; |
| | | |
| | | private String liftPosTwo = "-"; |
| | | |
| | | private String walkPos = "-"; |
| | | |
| | | private String walkPosTwo = "-"; |
| | | |
| | | private String taskReceive = "-"; |
| | | |
| | | private String taskReceiveTwo = "-"; |
| | | |
| | | private Integer bay; |
| | | |
| | | private Integer lev; |
| | | |
| | | private String liftPos = "-"; |
| | | |
| | | private String walkPos = "-"; |
| | | |
| | | private Integer xspeed = 0; |
| | | |
| | | private Integer yspeed = 0; |
| | |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<>()); |
| | | List<BasCrnp> basCrnps = basCrnpService.selectList(wrapper); |
| | | |
| | | List<BasCrnp> baseList = new ArrayList<>(); |
| | | List<BasCrnp> extraList = new ArrayList<>(); |
| | | for (BasCrnp basCrnp : basCrnps) { |
| | | if (excludeCrnList.contains(basCrnp.getCrnNo())) { |
| | | extraList.add(basCrnp); |
| | | }else { |
| | | baseList.add(basCrnp); |
| | | } |
| | | } |
| | | baseList.addAll(extraList); |
| | | |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | Integer crnNo = wrkMast.getCrnNo(); |
| | | map.put(crnNo, map.getOrDefault(crnNo, 0) + 1); |
| | | } |
| | | |
| | | List<BasCrnp> enabledCrnps = new ArrayList<>(); |
| | | for (BasCrnp basCrnp : basCrnps) { |
| | | for (BasCrnp basCrnp : baseList) { |
| | | CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, basCrnp.getCrnNo()); |
| | | if (crnThread == null) { |
| | | continue; |
| | |
| | | // æ£æ¥æ¯å¦è¶
è¿æå¤§å
¥åºä»»å¡æ° |
| | | if (maxInTaskControl && inWrkMasts.size() >= basCrnp.getMaxInTask()) { |
| | | News.info("å åæº:{} 已达æå¤§å
¥åºä»»å¡æ°ï¼å½å任塿°:{}", basCrnp.getCrnNo(), inWrkMasts.size()); |
| | | continue; |
| | | } |
| | | if (excludeCrnList.contains(basCrnp.getCrnNo())) { |
| | | continue; |
| | | } |
| | | |
| | |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<>()); |
| | | List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(wrapper); |
| | | |
| | | List<BasDualCrnp> baseList = new ArrayList<>(); |
| | | List<BasDualCrnp> extraList = new ArrayList<>(); |
| | | for (BasDualCrnp basDualCrnp : basDualCrnps) { |
| | | if (excludeCrnList.contains(basDualCrnp.getCrnNo())) { |
| | | extraList.add(basDualCrnp); |
| | | }else { |
| | | baseList.add(basDualCrnp); |
| | | } |
| | | } |
| | | baseList.addAll(extraList); |
| | | |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | Integer dualCrnNo = wrkMast.getDualCrnNo(); |
| | | map.put(dualCrnNo, map.getOrDefault(dualCrnNo, 0) + 1); |
| | | } |
| | | |
| | | List<BasDualCrnp> enabledCrnps = new ArrayList<>(); |
| | | for (BasDualCrnp basDualCrnp : basDualCrnps) { |
| | | for (BasDualCrnp basDualCrnp : baseList) { |
| | | DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo()); |
| | | if (dualCrnThread == null) { |
| | | continue; |
| | |
| | | ); |
| | | // æ£æ¥æ¯å¦è¶
è¿æå¤§å
¥åºä»»å¡æ° |
| | | if (maxInTaskControl && inWrkMasts.size() >= basDualCrnp.getMaxInTask()) { |
| | | News.info("å åæº:{} 已达æå¤§å
¥åºä»»å¡æ°ï¼å½å任塿°:{}", basDualCrnp.getCrnNo(), inWrkMasts.size()); |
| | | continue; |
| | | } |
| | | if (excludeCrnList.contains(basDualCrnp.getCrnNo())) { |
| | | News.info("åå·¥ä½å åæº:{} 已达æå¤§å
¥åºä»»å¡æ°ï¼å½å任塿°:{}", basDualCrnp.getCrnNo(), inWrkMasts.size()); |
| | | continue; |
| | | } |
| | | |
| | |
| | | return rowList; |
| | | } |
| | | |
| | | BasDualCrnpService basDualCrnpService = SpringUtils.getBean(BasDualCrnpService.class); |
| | | if (basDualCrnpService == null) { |
| | | return rowList; |
| | | } |
| | | |
| | | List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>()); |
| | | for (BasCrnp basCrnp : basCrnps) { |
| | | String deepRowsStr = basCrnp.getDeepRows(); |
| | | if(!Cools.isEmpty(deepRowsStr)){ |
| | | List<Integer> rows = JSON.parseArray(deepRowsStr, Integer.class); |
| | | rowList.addAll(rows); |
| | | } |
| | | } |
| | | |
| | | List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<BasDualCrnp>()); |
| | | for (BasDualCrnp basDualCrnp : basDualCrnps) { |
| | | String deepRowsStr = basDualCrnp.getDeepRows(); |
| | | if(!Cools.isEmpty(deepRowsStr)){ |
| | | List<Integer> rows = JSON.parseArray(deepRowsStr, Integer.class); |
| | | rowList.addAll(rows); |
| | |
| | | |
| | | //è·åæµ
åºä½æå· |
| | | public static Integer getShallowRowByDeepRow(Integer deepRow) { |
| | | SlaveType slaveType = checkRowDeviceType(deepRow); |
| | | if (slaveType == null) { |
| | | return null; |
| | | } |
| | | |
| | | if (slaveType.equals(SlaveType.Crn)) { |
| | | return getShallowRowByCrnDeepRow(deepRow); |
| | | } else if (slaveType.equals(SlaveType.DualCrn)) { |
| | | return getShallowRowByDualCrnDeepRow(deepRow); |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | |
| | | //è·åå åæºæµ
åºä½æå· |
| | | public static Integer getShallowRowByCrnDeepRow(Integer deepRow) { |
| | | BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class); |
| | | if (basCrnpService == null) { |
| | | return null; |
| | |
| | | } |
| | | } |
| | | |
| | | if (controlRowList == null) { |
| | | return null; |
| | | } |
| | | |
| | | for (Integer row : controlRowList) { |
| | | if (deepRow.equals(row)) { |
| | | continue; |
| | | } |
| | | |
| | | return row; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | //è·ååå·¥ä½å åæºæµ
åºä½æå· |
| | | public static Integer getShallowRowByDualCrnDeepRow(Integer deepRow) { |
| | | BasDualCrnpService basDualCrnpService = SpringUtils.getBean(BasDualCrnpService.class); |
| | | if (basDualCrnpService == null) { |
| | | return null; |
| | | } |
| | | |
| | | List<Integer> deepRowList = getDeepRowList(); |
| | | if (!deepRowList.contains(deepRow)) { |
| | | return null; |
| | | } |
| | | |
| | | List<Integer> controlRowList = null; |
| | | List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>()); |
| | | for (BasDualCrnp basDualCrnp : basDualCrnps) { |
| | | List<List<Integer>> rowList = basDualCrnp.getControlRows$(); |
| | | for (List<Integer> rows : rowList) { |
| | | if (rows.contains(deepRow)) { |
| | | controlRowList = rows; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (controlRowList != null) { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (controlRowList == null) { |
| | | return null; |
| | | } |
| | | |
| | | for (Integer row : controlRowList) { |
| | | if (deepRow.equals(row)) { |
| | | continue; |
| | |
| | | |
| | | //è·åæ·±åºä½æå· |
| | | public static Integer getDeepRowByShallowRow(Integer shallowRow) { |
| | | SlaveType slaveType = checkRowDeviceType(shallowRow); |
| | | |
| | | if (slaveType.equals(SlaveType.Crn)) { |
| | | return getDeepRowByCrnShallowRow(shallowRow); |
| | | } else if (slaveType.equals(SlaveType.DualCrn)) { |
| | | return getDeepRowByDualCrnShallowRow(shallowRow); |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | |
| | | //è·åå åæºæ·±åºä½æå· |
| | | public static Integer getDeepRowByCrnShallowRow(Integer shallowRow) { |
| | | BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class); |
| | | if (basCrnpService == null) { |
| | | return null; |
| | |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | //è·ååå·¥ä½å åæºæ·±åºä½æå· |
| | | public static Integer getDeepRowByDualCrnShallowRow(Integer shallowRow) { |
| | | BasDualCrnpService basDualCrnpService = SpringUtils.getBean(BasDualCrnpService.class); |
| | | if (basDualCrnpService == null) { |
| | | return null; |
| | | } |
| | | |
| | | List<Integer> controlRowList = null; |
| | | List<Integer> deepRowList = null; |
| | | List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>()); |
| | | for (BasDualCrnp basDualCrnp : basDualCrnps) { |
| | | List<List<Integer>> rowList = basDualCrnp.getControlRows$(); |
| | | for (List<Integer> rows : rowList) { |
| | | if (rows.contains(shallowRow)) { |
| | | controlRowList = rows; |
| | | deepRowList = JSON.parseArray(basDualCrnp.getDeepRows(), Integer.class); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (controlRowList != null) { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (deepRowList == null) { |
| | | return null; |
| | | } |
| | | |
| | | for (Integer row : controlRowList) { |
| | | if (!deepRowList.contains(row)) { |
| | | continue; |
| | | } |
| | | |
| | | return row; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | //æ£æµæå·è®¾å¤ç±»å |
| | | public static SlaveType checkRowDeviceType(Integer row) { |
| | | BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class); |
| | | if (basCrnpService == null) { |
| | | return null; |
| | | } |
| | | |
| | | BasDualCrnpService basDualCrnpService = SpringUtils.getBean(BasDualCrnpService.class); |
| | | if (basDualCrnpService == null) { |
| | | return null; |
| | | } |
| | | |
| | | List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>()); |
| | | for (BasCrnp basCrnp : basCrnps) { |
| | | List<List<Integer>> controlRows = basCrnp.getControlRows$(); |
| | | for (List<Integer> list : controlRows) { |
| | | if (list.contains(row)) { |
| | | return SlaveType.Crn; |
| | | } |
| | | } |
| | | } |
| | | |
| | | List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>()); |
| | | for (BasDualCrnp basDualCrnp : basDualCrnps) { |
| | | List<List<Integer>> controlRows = basDualCrnp.getControlRows$(); |
| | | for (List<Integer> list : controlRows) { |
| | | if (list.contains(row)) { |
| | | return SlaveType.DualCrn; |
| | | } |
| | | } |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | } |
| | |
| | | package com.zy.common.service; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.common.Cools; |
| | | import com.core.exception.CoolException; |
| | |
| | | if (!sourceCrnResult.getCrnNo().equals(targetCrnResult.getCrnNo())) { |
| | | throw new CoolException("æºåºä½åç®æ åºä½ä¸å¨åä¸å··é"); |
| | | } |
| | | Integer crnNo = targetCrnResult.getCrnNo(); |
| | | |
| | | // è·åå·¥ä½å· |
| | | int workNo = getWorkNo(WrkIoType.LOC_MOVE.id); |
| | |
| | | wrkMast.setIoPri(ioPri); |
| | | wrkMast.setSourceLocNo(param.getSourceLocNo()); |
| | | wrkMast.setLocNo(param.getLocNo()); // ç®æ åºä½ |
| | | wrkMast.setCrnNo(crnNo); |
| | | wrkMast.setWmsWrkNo(param.getTaskNo()); |
| | | wrkMast.setBarcode(sourceLocMast.getBarcode()); |
| | | wrkMast.setAppeTime(now); |
| | | wrkMast.setModiTime(now); |
| | | |
| | | if (targetCrnResult.getCrnType().equals(SlaveType.Crn)) { |
| | | wrkMast.setCrnNo(targetCrnResult.getCrnNo()); |
| | | } else if (targetCrnResult.getCrnType().equals(SlaveType.DualCrn)) { |
| | | wrkMast.setDualCrnNo(targetCrnResult.getCrnNo()); |
| | | }else { |
| | | throw new CoolException("æªç¥è®¾å¤ç±»å"); |
| | | } |
| | | |
| | | boolean res = wrkMastService.insert(wrkMast); |
| | | if (!res) { |
| | | News.error("ç§»åºä»»å¡ --- ä¿å工使¡£å¤±è´¥ï¼"); |
| | |
| | | DUAL_CRN_IO_EXECUTE_FINISH_LIMIT("dual_crn_io_execute_finish_limit_"), |
| | | STATION_IN_EXECUTE_LIMIT("station_in_execute_limit_"), |
| | | STATION_OUT_EXECUTE_LIMIT("station_out_execute_limit_"), |
| | | STATION_OUT_EXECUTE_COMPLETE_LIMIT("station_out_execute_complete_limit_"), |
| | | CHECK_STATION_RUN_BLOCK_LIMIT_("check_station_run_block_limit_"), |
| | | CHECK_SHALLOW_LOC_STATUS_LIMIT("check_shallow_loc_status_limit_"), |
| | | |
| | | DUAL_CRN_PICK_WAIT_NEXT_TASK("dual_crn_pick_wait_next_task_"), |
| | | DUAL_CRN_OUT_TASK_STATION_INFO("dual_crn_out_task_station_info_"), |
| | | |
| | | CURRENT_CIRCLE_TASK_CRN_NO("current_circle_task_crn_no_"), |
| | | AI_CHAT_HISTORY("ai_chat_history_"), |
| | |
| | | private Integer crnNo = 0; |
| | | |
| | | // ä»»å¡å· |
| | | private Short taskNo = 0; |
| | | private Integer taskNo = 0; |
| | | |
| | | /** |
| | | * 任塿¨¡å¼ï¼ |
| | | */ |
| | | private Short taskMode = 0; |
| | | private Integer taskMode = 0; |
| | | |
| | | // æºä½ç½®æå· |
| | | private Short sourcePosX = 0; |
| | | private Integer sourcePosX = 0; |
| | | |
| | | // æºä½ç½®åå· |
| | | private Short sourcePosY = 0; |
| | | private Integer sourcePosY = 0; |
| | | |
| | | // æºä½ç½®å±å· |
| | | private Short sourcePosZ = 0; |
| | | private Integer sourcePosZ = 0; |
| | | |
| | | // ç®æ ä½ç½®æå· |
| | | private Short destinationPosX = 0; |
| | | private Integer destinationPosX = 0; |
| | | |
| | | // ç®æ ä½ç½®åå· |
| | | private Short destinationPosY = 0; |
| | | private Integer destinationPosY = 0; |
| | | |
| | | // ç®æ ä½ç½®å±å· |
| | | private Short destinationPosZ = 0; |
| | | private Integer destinationPosZ = 0; |
| | | |
| | | // ä»»å¡ç¡®è®¤ 0ï¼æªç¡®è®¤ 1ï¼å·²ç¡®è®¤ |
| | | private Short command = 0; |
| | | private Integer command = 0; |
| | | |
| | | //å·¥ä½ |
| | | private Short station; |
| | | private Integer station; |
| | | |
| | | } |
| | |
| | | public Integer statusTwo; |
| | | |
| | | /** |
| | | * å åæºå½ååå· |
| | | */ |
| | | public Integer bay; |
| | | |
| | | public Integer bayTwo; |
| | | |
| | | /** |
| | | * å åæºå½åå±å· |
| | | */ |
| | | public Integer level; |
| | | |
| | | public Integer levelTwo; |
| | | |
| | | /** |
| | | * å½åè´§åä½ç½® |
| | | * 0 = è´§ååä½ |
| | | * 1 = è´§åå¨å·¦ä¾§ |
| | |
| | | public Integer forkPos; |
| | | |
| | | public Integer forkPosTwo; |
| | | |
| | | /** |
| | | * å½å载货å°ä½ç½® |
| | | * 0 = ä¸å®ä½ |
| | | * 1 = ä¸å®ä½ |
| | | */ |
| | | public Integer liftPos; |
| | | |
| | | public Integer liftPosTwo; |
| | | |
| | | /** |
| | | * èµ°è¡å¨å®ä½ |
| | | * 0 = å¨å®ä½ |
| | | * 1 = ä¸å¨å®ä½ |
| | | */ |
| | | public Integer walkPos; |
| | | |
| | | public Integer walkPosTwo; |
| | | |
| | | /** |
| | | * è½½è´§å°æç© |
| | |
| | | public Integer taskReceiveTwo; |
| | | |
| | | /** |
| | | * å åæºå½ååå· |
| | | */ |
| | | public Integer bay; |
| | | |
| | | /** |
| | | * å åæºå½åå±å· |
| | | */ |
| | | public Integer level; |
| | | |
| | | /** |
| | | * å½å载货å°ä½ç½® |
| | | * 0 = ä¸å®ä½ |
| | | * 1 = ä¸å®ä½ |
| | | */ |
| | | public Integer liftPos; |
| | | |
| | | /** |
| | | * èµ°è¡å¨å®ä½ |
| | | * 0 = å¨å®ä½ |
| | | * 1 = ä¸å¨å®ä½ |
| | | */ |
| | | public Integer walkPos; |
| | | |
| | | /** |
| | | * Xè¡èµ°çº¿é度m/min |
| | | */ |
| | | private Integer xSpeed; |
| | |
| | | |
| | | private ZyDualCrnStatusEntity crnStatus; |
| | | private DeviceConfig deviceConfig; |
| | | private final ExecutorService executor = Executors.newSingleThreadExecutor(); |
| | | // å
è®¸å¹¶è¡æ§è¡å¤ä¸ªå½ä»¤ä»»å¡ï¼åºå®çº¿ç¨æ± ï¼ãå¦éæ´é«å¹¶åå¯è°æ´å¤§å°ã |
| | | private final ExecutorService executor = Executors |
| | | .newFixedThreadPool(9999); |
| | | private int taskExecuteStation = 0; |
| | | |
| | | public ZyDualCrnFakeConnect(DeviceConfig deviceConfig) { |
| | | this.deviceConfig = deviceConfig; |
| | |
| | | } |
| | | |
| | | private void commandMove(DualCrnCommand command) { |
| | | int destinationPosX = command.getDestinationPosX().intValue(); |
| | | int destinationPosY = command.getDestinationPosY().intValue(); |
| | | int destinationPosZ = command.getDestinationPosZ().intValue(); |
| | | int taskMode = command.getTaskMode().intValue(); |
| | | int taskNo = command.getTaskNo().intValue(); |
| | | int destinationPosX = command.getDestinationPosX(); |
| | | int destinationPosY = command.getDestinationPosY(); |
| | | int destinationPosZ = command.getDestinationPosZ(); |
| | | int taskMode = command.getTaskMode(); |
| | | int taskNo = command.getTaskNo(); |
| | | int station = command.getStation(); |
| | | |
| | | while (true) { |
| | | if (taskExecuteStation == 0) { |
| | | taskExecuteStation = station; |
| | | } |
| | | |
| | | if (taskExecuteStation == station) { |
| | | break; |
| | | } |
| | | |
| | | sleep(200); |
| | | } |
| | | |
| | | if(command.getStation() == 1) { |
| | | this.crnStatus.setTaskNo(taskNo); |
| | | this.crnStatus.setStatus(CrnStatusType.MOVING.id); |
| | | this.crnStatus.setTaskReceive(1); |
| | | moveY(this.crnStatus.getBay(), destinationPosY, command.getStation().intValue()); |
| | | moveZ(this.crnStatus.getLevel(), destinationPosZ, command.getStation().intValue()); |
| | | moveYZ(this.crnStatus.getBay(), destinationPosY, this.crnStatus.getLevel(), destinationPosZ, command.getStation()); |
| | | this.crnStatus.setStatus(CrnStatusType.WAITING.id); |
| | | }else { |
| | | this.crnStatus.setTaskNoTwo(taskNo); |
| | | this.crnStatus.setStatusTwo(CrnStatusType.MOVING.id); |
| | | this.crnStatus.setTaskReceive(1); |
| | | moveY(this.crnStatus.getBayTwo(), destinationPosY, command.getStation().intValue()); |
| | | moveZ(this.crnStatus.getLevelTwo(), destinationPosZ, command.getStation().intValue()); |
| | | moveYZ(this.crnStatus.getBay(), destinationPosY, this.crnStatus.getLevel(), destinationPosZ, command.getStation()); |
| | | this.crnStatus.setStatusTwo(CrnStatusType.WAITING.id); |
| | | } |
| | | |
| | | taskExecuteStation = 0; |
| | | } |
| | | |
| | | private void commandTake(DualCrnCommand command) { |
| | | int sourcePosX = command.getSourcePosX().intValue(); |
| | | int sourcePosY = command.getSourcePosY().intValue(); |
| | | int sourcePosZ = command.getSourcePosZ().intValue(); |
| | | int destinationPosX = command.getDestinationPosX().intValue(); |
| | | int destinationPosY = command.getDestinationPosY().intValue(); |
| | | int destinationPosZ = command.getDestinationPosZ().intValue(); |
| | | int taskMode = command.getTaskMode().intValue(); |
| | | int taskNo = command.getTaskNo().intValue(); |
| | | int sourcePosX = command.getSourcePosX(); |
| | | int sourcePosY = command.getSourcePosY(); |
| | | int sourcePosZ = command.getSourcePosZ(); |
| | | int destinationPosX = command.getDestinationPosX(); |
| | | int destinationPosY = command.getDestinationPosY(); |
| | | int destinationPosZ = command.getDestinationPosZ(); |
| | | int taskMode = command.getTaskMode(); |
| | | int taskNo = command.getTaskNo(); |
| | | int station = command.getStation(); |
| | | |
| | | while (true) { |
| | | if (taskExecuteStation == 0) { |
| | | taskExecuteStation = station; |
| | | } |
| | | |
| | | if (taskExecuteStation == station) { |
| | | break; |
| | | } |
| | | |
| | | sleep(200); |
| | | } |
| | | |
| | | if(command.getStation() == 1) { |
| | | this.crnStatus.setTaskNo(taskNo); |
| | | this.crnStatus.setStatus(CrnStatusType.FETCH_MOVING.id); |
| | | this.crnStatus.setTaskReceive(1); |
| | | |
| | | moveY(this.crnStatus.getBay(), sourcePosY, command.getStation().intValue()); |
| | | moveZ(this.crnStatus.getLevel(), sourcePosZ, command.getStation().intValue()); |
| | | moveYZ(this.crnStatus.getBay(), sourcePosY,this.crnStatus.getLevel(), sourcePosZ,command.getStation()); |
| | | this.crnStatus.setStatus(CrnStatusType.FETCHING.id); |
| | | sleep(2000); |
| | | if (Thread.currentThread().isInterrupted()) { |
| | |
| | | |
| | | this.crnStatus.setLoaded(1); |
| | | this.crnStatus.setStatus(CrnStatusType.PUT_MOVING.id); |
| | | moveY(this.crnStatus.getBay(), destinationPosY, command.getStation().intValue()); |
| | | moveZ(this.crnStatus.getLevel(), destinationPosZ, command.getStation().intValue()); |
| | | moveYZ(this.crnStatus.getBay(), destinationPosY,this.crnStatus.getLevel(), destinationPosZ, command.getStation()); |
| | | this.crnStatus.setStatus(CrnStatusType.PUTTING.id); |
| | | sleep(2000); |
| | | if (Thread.currentThread().isInterrupted()) { |
| | |
| | | this.crnStatus.setStatusTwo(CrnStatusType.FETCH_MOVING.id); |
| | | this.crnStatus.setTaskReceiveTwo(1); |
| | | |
| | | moveY(this.crnStatus.getBayTwo(), sourcePosY, command.getStation().intValue()); |
| | | moveZ(this.crnStatus.getLevelTwo(), sourcePosZ, command.getStation().intValue()); |
| | | moveYZ(this.crnStatus.getBay(), sourcePosY,this.crnStatus.getLevel(), sourcePosZ, command.getStation()); |
| | | this.crnStatus.setStatusTwo(CrnStatusType.FETCHING.id); |
| | | sleep(2000); |
| | | if (Thread.currentThread().isInterrupted()) { |
| | |
| | | |
| | | this.crnStatus.setLoadedTwo(1); |
| | | this.crnStatus.setStatusTwo(CrnStatusType.PUT_MOVING.id); |
| | | moveY(this.crnStatus.getBayTwo(), destinationPosY, command.getStation().intValue()); |
| | | moveZ(this.crnStatus.getLevelTwo(), destinationPosZ, command.getStation().intValue()); |
| | | moveYZ(this.crnStatus.getBay(), destinationPosY,this.crnStatus.getLevel(), destinationPosZ, command.getStation()); |
| | | this.crnStatus.setStatusTwo(CrnStatusType.PUTTING.id); |
| | | sleep(2000); |
| | | if (Thread.currentThread().isInterrupted()) { |
| | |
| | | this.crnStatus.setLoadedTwo(0); |
| | | this.crnStatus.setStatusTwo(CrnStatusType.WAITING.id); |
| | | } |
| | | |
| | | taskExecuteStation = 0; |
| | | } |
| | | |
| | | private void commandPick(DualCrnCommand command) { |
| | | int destinationPosX = command.getDestinationPosX().intValue(); |
| | | int destinationPosY = command.getDestinationPosY().intValue(); |
| | | int destinationPosZ = command.getDestinationPosZ().intValue(); |
| | | int taskMode = command.getTaskMode().intValue(); |
| | | int taskNo = command.getTaskNo().intValue(); |
| | | int destinationPosX = command.getDestinationPosX(); |
| | | int destinationPosY = command.getDestinationPosY(); |
| | | int destinationPosZ = command.getDestinationPosZ(); |
| | | int taskMode = command.getTaskMode(); |
| | | int taskNo = command.getTaskNo(); |
| | | int station = command.getStation(); |
| | | |
| | | while (true) { |
| | | if (taskExecuteStation == 0) { |
| | | taskExecuteStation = station; |
| | | } |
| | | |
| | | if (taskExecuteStation == station) { |
| | | break; |
| | | } |
| | | |
| | | sleep(200); |
| | | } |
| | | |
| | | if(command.getStation() == 1) { |
| | | this.crnStatus.setTaskNo(taskNo); |
| | | this.crnStatus.setStatus(CrnStatusType.FETCH_MOVING.id); |
| | | this.crnStatus.setTaskReceive(1); |
| | | |
| | | moveY(this.crnStatus.getBay(), destinationPosY, command.getStation().intValue()); |
| | | moveZ(this.crnStatus.getLevel(), destinationPosZ, command.getStation().intValue()); |
| | | moveYZ(this.crnStatus.getBay(), destinationPosY,this.crnStatus.getLevel(), destinationPosZ, command.getStation()); |
| | | this.crnStatus.setStatus(CrnStatusType.FETCHING.id); |
| | | sleep(2000); |
| | | sleep(3000); |
| | | if (Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | |
| | | this.crnStatus.setStatusTwo(CrnStatusType.FETCH_MOVING.id); |
| | | this.crnStatus.setTaskReceiveTwo(1); |
| | | |
| | | moveY(this.crnStatus.getBayTwo(), destinationPosY, command.getStation().intValue()); |
| | | moveZ(this.crnStatus.getLevelTwo(), destinationPosZ, command.getStation().intValue()); |
| | | moveYZ(this.crnStatus.getBay(), destinationPosY,this.crnStatus.getLevel(), destinationPosZ, command.getStation()); |
| | | this.crnStatus.setStatusTwo(CrnStatusType.FETCHING.id); |
| | | sleep(2000); |
| | | sleep(3000); |
| | | if (Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | | this.crnStatus.setLoadedTwo(1); |
| | | this.crnStatus.setStatusTwo(CrnStatusType.WAITING.id); |
| | | } |
| | | |
| | | taskExecuteStation = 0; |
| | | } |
| | | |
| | | private void commandPut(DualCrnCommand command) { |
| | | int destinationPosX = command.getDestinationPosX().intValue(); |
| | | int destinationPosY = command.getDestinationPosY().intValue(); |
| | | int destinationPosZ = command.getDestinationPosZ().intValue(); |
| | | int taskMode = command.getTaskMode().intValue(); |
| | | int taskNo = command.getTaskNo().intValue(); |
| | | int destinationPosX = command.getDestinationPosX(); |
| | | int destinationPosY = command.getDestinationPosY(); |
| | | int destinationPosZ = command.getDestinationPosZ(); |
| | | int taskMode = command.getTaskMode(); |
| | | int taskNo = command.getTaskNo(); |
| | | int station = command.getStation(); |
| | | |
| | | while (true) { |
| | | if (taskExecuteStation == 0) { |
| | | taskExecuteStation = station; |
| | | } |
| | | |
| | | if (taskExecuteStation == station) { |
| | | break; |
| | | } |
| | | |
| | | sleep(200); |
| | | } |
| | | |
| | | if(command.getStation() == 1) { |
| | | this.crnStatus.setTaskNo(taskNo); |
| | | this.crnStatus.setStatus(CrnStatusType.PUT_MOVING.id); |
| | | this.crnStatus.setTaskReceive(1); |
| | | |
| | | moveY(this.crnStatus.getBay(), destinationPosY, command.getStation().intValue()); |
| | | moveZ(this.crnStatus.getLevel(), destinationPosZ, command.getStation().intValue()); |
| | | moveYZ(this.crnStatus.getBay(), destinationPosY,this.crnStatus.getLevel(), destinationPosZ, command.getStation()); |
| | | this.crnStatus.setStatus(CrnStatusType.PUTTING.id); |
| | | sleep(2000); |
| | | sleep(3000); |
| | | if (Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | |
| | | this.crnStatus.setStatusTwo(CrnStatusType.PUT_MOVING.id); |
| | | this.crnStatus.setTaskReceiveTwo(1); |
| | | |
| | | moveY(this.crnStatus.getBayTwo(), destinationPosY, command.getStation().intValue()); |
| | | moveZ(this.crnStatus.getLevelTwo(), destinationPosZ, command.getStation().intValue()); |
| | | moveYZ(this.crnStatus.getBay(), destinationPosY,this.crnStatus.getLevel(), destinationPosZ, command.getStation()); |
| | | this.crnStatus.setStatusTwo(CrnStatusType.PUTTING.id); |
| | | sleep(2000); |
| | | sleep(3000); |
| | | if (Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | | this.crnStatus.setLoadedTwo(0); |
| | | this.crnStatus.setStatusTwo(CrnStatusType.WAITING.id); |
| | | } |
| | | |
| | | taskExecuteStation = 0; |
| | | } |
| | | |
| | | private void moveZ(int sourcePosZ, int destinationPosZ, int station) { |
| | |
| | | int initSourcePosZ = sourcePosZ; |
| | | for(int i = 0; i < moveLength; i++) { |
| | | initSourcePosZ++; |
| | | if(station == 1) { |
| | | this.crnStatus.setLevel(initSourcePosZ); |
| | | }else { |
| | | this.crnStatus.setLevelTwo(initSourcePosZ); |
| | | } |
| | | sleep(1000); |
| | | if (Thread.currentThread().isInterrupted()) { |
| | | return; |
| | |
| | | int initSourcePosZ = sourcePosZ; |
| | | for(int i = 0; i < moveLength; i++) { |
| | | initSourcePosZ--; |
| | | if(station == 1) { |
| | | this.crnStatus.setLevel(initSourcePosZ); |
| | | }else { |
| | | this.crnStatus.setLevelTwo(initSourcePosZ); |
| | | } |
| | | this.crnStatus.setLevel(initSourcePosZ); |
| | | sleep(1000); |
| | | if (Thread.currentThread().isInterrupted()) { |
| | |
| | | int initSourcePosY = sourcePosY; |
| | | for(int i = 0; i < moveLength; i++) { |
| | | initSourcePosY++; |
| | | if(station == 1) { |
| | | this.crnStatus.setBay(initSourcePosY); |
| | | }else { |
| | | this.crnStatus.setBayTwo(initSourcePosY); |
| | | } |
| | | sleep(1000); |
| | | sleep(500); |
| | | if (Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | |
| | | int initSourcePosY = sourcePosY; |
| | | for(int i = 0; i < moveLength; i++) { |
| | | initSourcePosY--; |
| | | if(station == 1) { |
| | | this.crnStatus.setBay(initSourcePosY); |
| | | }else { |
| | | this.crnStatus.setBayTwo(initSourcePosY); |
| | | } |
| | | sleep(1000); |
| | | sleep(500); |
| | | if (Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | private void moveYZ(int sourcePosY, int destinationPosY, int sourcePosZ, int destinationPosZ, int station) { |
| | | moveY(sourcePosY, destinationPosY, station); |
| | | moveZ(sourcePosZ, destinationPosZ, station); |
| | | } |
| | | |
| | | private void sleep(long ms) { |
| | | try { |
| | | Thread.sleep(ms); |
| | |
| | | //å·¥ä½1 |
| | | crnStatus.setTaskNo((int) siemensNet.getByteTransform().TransInt16(result.Content, 2)); |
| | | crnStatus.setStatus((int) siemensNet.getByteTransform().TransInt16(result.Content, 4)); |
| | | crnStatus.setBay((int) siemensNet.getByteTransform().TransInt16(result.Content, 6)); |
| | | crnStatus.setLevel((int) siemensNet.getByteTransform().TransInt16(result.Content, 8)); |
| | | crnStatus.setForkPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 10)); |
| | | crnStatus.setLoaded((int) siemensNet.getByteTransform().TransInt16(result.Content, 12)); |
| | | crnStatus.setWalkPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 26)); |
| | | |
| | | //å·¥ä½2 |
| | | crnStatus.setTaskNoTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 14)); |
| | | crnStatus.setStatusTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 16)); |
| | | crnStatus.setBayTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 18)); |
| | | crnStatus.setLevelTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 20)); |
| | | crnStatus.setForkPosTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 22)); |
| | | crnStatus.setLoadedTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 24)); |
| | | crnStatus.setWalkPosTwo((int) siemensNet.getByteTransform().TransInt16(result.Content, 28)); |
| | | |
| | | crnStatus.setBay((int) siemensNet.getByteTransform().TransInt16(result.Content, 6)); |
| | | crnStatus.setLevel((int) siemensNet.getByteTransform().TransInt16(result.Content, 8)); |
| | | crnStatus.setWalkPos((int) siemensNet.getByteTransform().TransInt16(result.Content, 26)); |
| | | crnStatus.setAlarm((int) siemensNet.getByteTransform().TransInt16(result.Content, 18)); |
| | | crnStatus.setTemp1((int) siemensNet.getByteTransform().TransInt16(result.Content, 20)); |
| | | crnStatus.setTemp2((int) siemensNet.getByteTransform().TransInt16(result.Content, 22)); |
| | |
| | | stationOperateProcessUtils.stationOutExecuteFinish(); |
| | | |
| | | //æ§è¡åå·¥ä½å åæºä»»å¡ |
| | | dualCrnOperateProcessUtils.dualRrnIoExecute(); |
| | | dualCrnOperateProcessUtils.dualCrnIoExecute(); |
| | | //åå·¥ä½å åæºä»»å¡æ§è¡å®æ |
| | | dualCrnOperateProcessUtils.dualCrnIoExecuteFinish(); |
| | | } |
| | |
| | | continue; |
| | | } |
| | | DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus(); |
| | | if (!dualCrnProtocol.getStatusType().equals(DualCrnStatusType.PUT_MOVING) && !dualCrnProtocol.getStatusType().equals(DualCrnStatusType.PUTTING)) { |
| | | |
| | | boolean reset = false; |
| | | if (dualCrnProtocol.getTaskNo() > 0 && dualCrnProtocol.getLoaded() == 1) { |
| | | reset = true; |
| | | } |
| | | |
| | | if (dualCrnProtocol.getTaskNoTwo() > 0 && dualCrnProtocol.getLoadedTwo() == 1) { |
| | | reset = true; |
| | | } |
| | | |
| | | if (!reset) { |
| | | continue; |
| | | } |
| | | |
| | |
| | | |
| | | import java.text.MessageFormat; |
| | | import java.util.Date; |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.ThreadFactory; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | @Data |
| | | @Slf4j |
| | |
| | | private ZyRgvConnectDriver zyRgvConnectDriver; |
| | | private RgvProtocol rgvProtocol; |
| | | private int deviceLogCollectTime = 200; |
| | | private volatile boolean closed = false; |
| | | private ScheduledExecutorService readExecutor; |
| | | private ScheduledExecutorService processExecutor; |
| | | |
| | | public ZyRgvThread(DeviceConfig deviceConfig, RedisUtil redisUtil) { |
| | | this.deviceConfig = deviceConfig; |
| | |
| | | public void run() { |
| | | connect(); |
| | | initRgv(); |
| | | readExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | Thread t = new Thread(r); |
| | | t.setName("RgvReader-" + deviceConfig.getDeviceNo()); |
| | | t.setDaemon(true); |
| | | return t; |
| | | } |
| | | }); |
| | | readExecutor.scheduleAtFixedRate(() -> { |
| | | if (closed || Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | | |
| | | Thread readThread = new Thread(() -> { |
| | | while (true) { |
| | | try { |
| | | deviceLogCollectTime = Utils.getDeviceLogCollectTime(); |
| | | readStatus(); |
| | | Thread.sleep(100); |
| | | } catch (Exception e) { |
| | | log.error("RgvThread Fail", e); |
| | | } |
| | | }, 0, 200, TimeUnit.MILLISECONDS); |
| | | |
| | | processExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | Thread t = new Thread(r); |
| | | t.setName("RgvWriter-" + deviceConfig.getDeviceNo()); |
| | | t.setDaemon(true); |
| | | return t; |
| | | } |
| | | }); |
| | | processExecutor.scheduleAtFixedRate(() -> { |
| | | if (closed || Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | | readThread.start(); |
| | | |
| | | Thread processThread = new Thread(() -> { |
| | | while (true) { |
| | | try { |
| | | int step = 1; |
| | | Task task = MessageQueue.poll(SlaveType.Rgv, deviceConfig.getDeviceNo()); |
| | | if (task != null) { |
| | | step = task.getStep(); |
| | | } |
| | | if (step == 2 && task != null) { |
| | | if (step == 2) { |
| | | sendCommand((RgvCommand) task.getData()); |
| | | } |
| | | |
| | | Thread.sleep(100); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | log.error("RgvProcess Fail", e); |
| | | } |
| | | }, 0, 200, TimeUnit.MILLISECONDS); |
| | | } |
| | | }); |
| | | processThread.start(); |
| | | } |
| | | |
| | | private void initRgv() { |
| | |
| | | |
| | | @Override |
| | | public void close() { |
| | | closed = true; |
| | | if (zyRgvConnectDriver != null) { |
| | | zyRgvConnectDriver.close(); |
| | | } |
| | | ScheduledExecutorService ex = readExecutor; |
| | | if (ex != null) { |
| | | try { ex.shutdownNow(); } catch (Exception ignore) {} |
| | | } |
| | | ScheduledExecutorService px = processExecutor; |
| | | if (px != null) { |
| | | try { px.shutdownNow(); } catch (Exception ignore) {} |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | import java.text.MessageFormat; |
| | | import java.util.Date; |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.ThreadFactory; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | /** |
| | | * å åæºçº¿ç¨ |
| | |
| | | private ZyCrnConnectDriver zyCrnConnectDriver; |
| | | private CrnProtocol crnProtocol; |
| | | private int deviceLogCollectTime = 200; |
| | | private boolean resetFlag = false; |
| | | private volatile boolean closed = false; |
| | | private ScheduledExecutorService readExecutor; |
| | | private ScheduledExecutorService processExecutor; |
| | | |
| | | public ZySiemensCrnThread(DeviceConfig deviceConfig, RedisUtil redisUtil) { |
| | | this.deviceConfig = deviceConfig; |
| | |
| | | public void run() { |
| | | this.connect(); |
| | | this.initCrn(); |
| | | readExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | Thread t = new Thread(r); |
| | | t.setName("CrnReader-" + deviceConfig.getDeviceNo()); |
| | | t.setDaemon(true); |
| | | return t; |
| | | } |
| | | }); |
| | | readExecutor.scheduleAtFixedRate(() -> { |
| | | if (closed || Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | | |
| | | Thread readThread = new Thread(() -> { |
| | | while (true) { |
| | | try { |
| | | deviceLogCollectTime = Utils.getDeviceLogCollectTime(); |
| | | readStatus(); |
| | | Thread.sleep(100); |
| | | } catch (Exception e) { |
| | | log.error("CrnThread Fail", e); |
| | | } |
| | | }, 0, 200, TimeUnit.MILLISECONDS); |
| | | |
| | | processExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | Thread t = new Thread(r); |
| | | t.setName("CrnWriter-" + deviceConfig.getDeviceNo()); |
| | | t.setDaemon(true); |
| | | return t; |
| | | } |
| | | }); |
| | | processExecutor.scheduleAtFixedRate(() -> { |
| | | if (closed || Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | | readThread.start(); |
| | | |
| | | Thread processThread = new Thread(() -> { |
| | | while (true) { |
| | | try { |
| | | int step = 1; |
| | | Task task = MessageQueue.poll(SlaveType.Crn, deviceConfig.getDeviceNo()); |
| | | if (task != null) { |
| | | step = task.getStep(); |
| | | } |
| | | if (step == 2 && task != null) { |
| | | if (step == 2) { |
| | | sendCommand((CrnCommand) task.getData()); |
| | | } |
| | | |
| | | Thread.sleep(100); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | log.error("CrnProcess Fail", e); |
| | | } |
| | | }, 0, 200, TimeUnit.MILLISECONDS); |
| | | } |
| | | }); |
| | | processThread.start(); |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | @Override |
| | | public void close() { |
| | | closed = true; |
| | | ScheduledExecutorService ex = readExecutor; |
| | | if (ex != null) { |
| | | try { ex.shutdownNow(); } catch (Exception ignore) {} |
| | | } |
| | | ScheduledExecutorService px = processExecutor; |
| | | if (px != null) { |
| | | try { px.shutdownNow(); } catch (Exception ignore) {} |
| | | } |
| | | if (zyCrnConnectDriver != null) { |
| | | zyCrnConnectDriver.close(); |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.common.DateUtils; |
| | | import com.core.common.SpringUtils; |
| | | import com.zy.asrs.entity.BasDualCrnp; |
| | | import com.zy.asrs.entity.BasDualCrnpOpt; |
| | | import com.zy.asrs.entity.DeviceConfig; |
| | | import com.zy.asrs.entity.DeviceDataLog; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.service.BasDualCrnpOptService; |
| | | import com.zy.asrs.service.BasDualCrnpService; |
| | | import com.zy.asrs.service.WrkMastService; |
| | | import com.zy.asrs.utils.Utils; |
| | | import com.zy.common.utils.RedisUtil; |
| | | import com.zy.core.News; |
| | | import com.zy.core.cache.MessageQueue; |
| | | import com.zy.core.cache.OutputQueue; |
| | | import com.zy.core.cache.SlaveConnection; |
| | | import com.zy.core.enums.*; |
| | | import com.zy.core.model.CommandResponse; |
| | | import com.zy.core.model.StationObjModel; |
| | | import com.zy.core.model.Task; |
| | | import com.zy.core.model.command.DualCrnCommand; |
| | | import com.zy.core.model.protocol.DualCrnProtocol; |
| | | import com.zy.core.model.protocol.StationProtocol; |
| | | import com.zy.core.network.DeviceConnectPool; |
| | | import com.zy.core.network.ZyDualCrnConnectDriver; |
| | | import com.zy.core.network.entity.ZyDualCrnStatusEntity; |
| | | import com.zy.core.thread.DualCrnThread; |
| | | import com.zy.core.thread.StationThread; |
| | | import lombok.Data; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.ThreadFactory; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * åå·¥ä½å åæºçº¿ç¨ |
| | |
| | | private ZyDualCrnConnectDriver zyDualCrnConnectDriver; |
| | | private DualCrnProtocol crnProtocol; |
| | | private int deviceLogCollectTime = 200; |
| | | private boolean resetFlag = false; |
| | | private volatile boolean closed = false; |
| | | private ScheduledExecutorService readExecutor; |
| | | private ScheduledExecutorService processExecutor; |
| | | private ScheduledExecutorService commandExecutor; |
| | | |
| | | public ZySiemensDualCrnThread(DeviceConfig deviceConfig, RedisUtil redisUtil) { |
| | | this.deviceConfig = deviceConfig; |
| | |
| | | public void run() { |
| | | this.connect(); |
| | | this.initCrn(); |
| | | readExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | Thread t = new Thread(r); |
| | | t.setName("DualCrnReader-" + deviceConfig.getDeviceNo()); |
| | | t.setDaemon(true); |
| | | return t; |
| | | } |
| | | }); |
| | | readExecutor.scheduleAtFixedRate(() -> { |
| | | if (closed || Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | | |
| | | Thread readThread = new Thread(() -> { |
| | | while (true) { |
| | | try { |
| | | deviceLogCollectTime = Utils.getDeviceLogCollectTime(); |
| | | readStatus(); |
| | | Thread.sleep(100); |
| | | } catch (Exception e) { |
| | | log.error("DualCrnThread Fail", e); |
| | | } |
| | | }, 0, 200, TimeUnit.MILLISECONDS); |
| | | |
| | | processExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | Thread t = new Thread(r); |
| | | t.setName("DualCrnWriter-" + deviceConfig.getDeviceNo()); |
| | | t.setDaemon(true); |
| | | return t; |
| | | } |
| | | }); |
| | | processExecutor.scheduleAtFixedRate(() -> { |
| | | if (closed || Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | | readThread.start(); |
| | | |
| | | Thread processThread = new Thread(() -> { |
| | | while (true) { |
| | | try { |
| | | int step = 1; |
| | | Task task = MessageQueue.poll(SlaveType.DualCrn, deviceConfig.getDeviceNo()); |
| | |
| | | } else if (step == 3) { |
| | | sendCommand((DualCrnCommand) task.getData()); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | }, 0, 200, TimeUnit.MILLISECONDS); |
| | | |
| | | commandExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | Thread t = new Thread(r); |
| | | t.setName("DualCrnCommand-" + deviceConfig.getDeviceNo()); |
| | | t.setDaemon(true); |
| | | return t; |
| | | Thread.sleep(100); |
| | | } catch (Exception e) { |
| | | log.error("DualCrnProcess Fail", e); |
| | | } |
| | | } |
| | | }); |
| | | commandExecutor.scheduleAtFixedRate(() -> { |
| | | if (closed || Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | | processThread.start(); |
| | | |
| | | Thread commandThread = new Thread(() -> { |
| | | while (true) { |
| | | try { |
| | | if(crnProtocol.getMode() != DualCrnModeType.AUTO.id) { |
| | | return; |
| | | continue; |
| | | } |
| | | |
| | | if(crnProtocol.getAlarm() != 0) { |
| | | return; |
| | | continue; |
| | | } |
| | | |
| | | //çå¾
ä¸ä¸ä¸ªä»»å¡ |
| | | if (crnProtocol.getLoaded() == 1 && crnProtocol.getLoadedTwo() == 1) { |
| | | Object wait = redisUtil.get(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo()); |
| | | if (wait != null) { |
| | | return; |
| | | redisUtil.del(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo()); |
| | | } |
| | | } |
| | | |
| | | if(crnProtocol.getTaskNo() > 0 && crnProtocol.getStatus() == DualCrnStatusType.IDLE.id) { |
| | |
| | | Object commandObj = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo); |
| | | if (commandObj == null) { |
| | | News.error("åå·¥ä½å åæºï¼å·¥ä½1空é²çå¾
ä¸åå½ä»¤ï¼ä½æªæ¾å°å½ä»¤ãå åæºå·={}ï¼å·¥ä½å·={}", crnProtocol.getCrnNo(), taskNo); |
| | | return; |
| | | continue; |
| | | } |
| | | |
| | | JSONObject commandMap = JSON.parseObject(commandObj.toString()); |
| | | Integer idx = commandMap.getInteger("idx"); |
| | | List<DualCrnCommand> commandList = commandMap.getJSONArray("commands").toJavaList(DualCrnCommand.class); |
| | | if (idx >= commandList.size()) { |
| | | continue; |
| | | } |
| | | DualCrnCommand dualCommand = commandList.get(idx); |
| | | |
| | | if (dualCommand.getTaskMode() == DualCrnTaskModeType.PUT.id.shortValue()) { |
| | | //çå¾
ä¸ä¸ä¸ªä»»å¡ |
| | | Object wait = redisUtil.get(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo()); |
| | | if (wait != null) { |
| | | continue; |
| | | } |
| | | |
| | | Object outTaskStationInfoObj = redisUtil.get(RedisKeyType.DUAL_CRN_OUT_TASK_STATION_INFO.key + taskNo); |
| | | if (outTaskStationInfoObj != null) { |
| | | //æ£æµåºå£ç«æ¯å¦å¯æ§è¡æ¾è´§å¨ä½ |
| | | StationObjModel stationObjModel = JSON.parseObject(outTaskStationInfoObj.toString(), StationObjModel.class); |
| | | StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo()); |
| | | if (stationThread == null) { |
| | | continue; |
| | | } |
| | | |
| | | Map<Integer, StationProtocol> statusMap = stationThread.getStatusMap(); |
| | | StationProtocol stationProtocol = statusMap.get(stationObjModel.getStationId()); |
| | | if (stationProtocol == null) { |
| | | continue; |
| | | } |
| | | |
| | | if (!stationProtocol.isAutoing()) { |
| | | continue; |
| | | } |
| | | |
| | | if (stationProtocol.isLoading()) { |
| | | continue; |
| | | } |
| | | |
| | | if (stationProtocol.getTaskNo() > 0) { |
| | | continue; |
| | | } |
| | | } |
| | | } |
| | | |
| | | idx++; |
| | | commandMap.put("idx", idx); |
| | | sendCommand(dualCommand); |
| | |
| | | Object commandObj = redisUtil.get(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo); |
| | | if (commandObj == null) { |
| | | News.error("åå·¥ä½å åæºï¼å·¥ä½2空é²çå¾
ä¸åå½ä»¤ï¼ä½æªæ¾å°å½ä»¤ãå åæºå·={}ï¼å·¥ä½å·={}", crnProtocol.getCrnNo(), taskNo); |
| | | return; |
| | | continue; |
| | | } |
| | | |
| | | JSONObject commandMap = JSON.parseObject(commandObj.toString()); |
| | | Integer idx = commandMap.getInteger("idx"); |
| | | List<DualCrnCommand> commandList = commandMap.getJSONArray("commands").toJavaList(DualCrnCommand.class); |
| | | if (idx >= commandList.size()) { |
| | | continue; |
| | | } |
| | | DualCrnCommand dualCommand = commandList.get(idx); |
| | | |
| | | if (dualCommand.getTaskMode() == DualCrnTaskModeType.PUT.id.shortValue()) { |
| | | //çå¾
ä¸ä¸ä¸ªä»»å¡ |
| | | Object wait = redisUtil.get(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnProtocol.getCrnNo()); |
| | | if (wait != null) { |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | idx++; |
| | | commandMap.put("idx", idx); |
| | | sendCommand(dualCommand); |
| | | redisUtil.set(RedisKeyType.DUAL_CRN_COMMAND_.key + taskNo, commandMap.toJSONString(), 60 * 60 * 24); |
| | | } |
| | | |
| | | Thread.sleep(100); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | log.error("DualCrnCommandThread Fail", e); |
| | | log.error("DualCrnCommand Fail", e); |
| | | } |
| | | }, 0, 200, TimeUnit.MILLISECONDS); |
| | | } |
| | | }); |
| | | commandThread.start(); |
| | | } |
| | | |
| | | /** |
| | |
| | | //å·¥ä½1 |
| | | crnProtocol.setTaskNo(crnStatus.getTaskNo()); |
| | | crnProtocol.setStatus(crnStatus.getStatus()); |
| | | crnProtocol.setBay(crnStatus.getBay()); |
| | | crnProtocol.setLevel(crnStatus.getLevel()); |
| | | crnProtocol.setForkPos(crnStatus.getForkPos()); |
| | | crnProtocol.setLoaded(crnStatus.getLoaded()); |
| | | crnProtocol.setWalkPos(crnStatus.getWalkPos()); |
| | | crnProtocol.setLiftPos(crnStatus.getLiftPos()); |
| | | crnProtocol.setTaskReceive(crnStatus.getTaskReceive()); |
| | | |
| | | //å·¥ä½2 |
| | | crnProtocol.setTaskNoTwo(crnStatus.getTaskNoTwo()); |
| | | crnProtocol.setStatusTwo(crnStatus.getStatusTwo()); |
| | | crnProtocol.setBayTwo(crnStatus.getBayTwo()); |
| | | crnProtocol.setLevelTwo(crnStatus.getLevelTwo()); |
| | | crnProtocol.setForkPosTwo(crnStatus.getForkPosTwo()); |
| | | crnProtocol.setLoadedTwo(crnStatus.getLoadedTwo()); |
| | | crnProtocol.setWalkPosTwo(crnStatus.getWalkPosTwo()); |
| | | crnProtocol.setLiftPosTwo(crnStatus.getLiftPosTwo()); |
| | | crnProtocol.setTaskReceiveTwo(crnStatus.getTaskReceiveTwo()); |
| | | |
| | | crnProtocol.setBay(crnStatus.getBay()); |
| | | crnProtocol.setLevel(crnStatus.getLevel()); |
| | | crnProtocol.setWalkPos(crnStatus.getWalkPos()); |
| | | crnProtocol.setLiftPos(crnStatus.getLiftPos()); |
| | | crnProtocol.setAlarm(crnStatus.getAlarm()); |
| | | crnProtocol.setTemp1(crnStatus.getTemp1()); |
| | | crnProtocol.setTemp2(crnStatus.getTemp2()); |
| | |
| | | |
| | | @Override |
| | | public void close() { |
| | | closed = true; |
| | | ScheduledExecutorService ex = readExecutor; |
| | | if (ex != null) { |
| | | try { ex.shutdownNow(); } catch (Exception ignore) {} |
| | | } |
| | | ScheduledExecutorService px = processExecutor; |
| | | if (px != null) { |
| | | try { px.shutdownNow(); } catch (Exception ignore) {} |
| | | } |
| | | if (zyDualCrnConnectDriver != null) { |
| | | zyDualCrnConnectDriver.close(); |
| | | } |
| | |
| | | public DualCrnCommand getPickAndPutCommand(String sourceLocNo, String targetLocNo, Integer taskNo, Integer crnNo, Integer station) { |
| | | DualCrnCommand crnCommand = new DualCrnCommand(); |
| | | crnCommand.setCrnNo(crnNo); // å åæºç¼å· |
| | | crnCommand.setTaskNo(taskNo.shortValue()); // å·¥ä½å· |
| | | crnCommand.setTaskMode(DualCrnTaskModeType.TRANSFER.id.shortValue()); // 任塿¨¡å¼: åæ¾è´§ |
| | | crnCommand.setSourcePosX((short) Utils.getRow(sourceLocNo)); // æºåºä½æ |
| | | crnCommand.setSourcePosY((short) Utils.getBay(sourceLocNo)); // æºåºä½å |
| | | crnCommand.setSourcePosZ((short) Utils.getLev(sourceLocNo)); // æºåºä½å± |
| | | crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo)); // ç®æ åºä½æ |
| | | crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo)); // ç®æ åºä½å |
| | | crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo)); // ç®æ åºä½å± |
| | | crnCommand.setStation(station.shortValue());//å·¥ä½ |
| | | crnCommand.setCommand((short) 1); // ä»»å¡ç¡®è®¤ |
| | | crnCommand.setTaskNo(taskNo); // å·¥ä½å· |
| | | crnCommand.setTaskMode(DualCrnTaskModeType.TRANSFER.id); // 任塿¨¡å¼: åæ¾è´§ |
| | | crnCommand.setSourcePosX(Utils.getRow(sourceLocNo)); // æºåºä½æ |
| | | crnCommand.setSourcePosY(Utils.getBay(sourceLocNo)); // æºåºä½å |
| | | crnCommand.setSourcePosZ(Utils.getLev(sourceLocNo)); // æºåºä½å± |
| | | crnCommand.setDestinationPosX(Utils.getRow(targetLocNo)); // ç®æ åºä½æ |
| | | crnCommand.setDestinationPosY(Utils.getBay(targetLocNo)); // ç®æ åºä½å |
| | | crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo)); // ç®æ åºä½å± |
| | | crnCommand.setStation(station);//å·¥ä½ |
| | | crnCommand.setCommand(1); // ä»»å¡ç¡®è®¤ |
| | | return crnCommand; |
| | | } |
| | | |
| | |
| | | public DualCrnCommand getPickCommand(String targetLocNo, Integer taskNo, Integer crnNo, Integer station) { |
| | | DualCrnCommand crnCommand = new DualCrnCommand(); |
| | | crnCommand.setCrnNo(crnNo); // å åæºç¼å· |
| | | crnCommand.setTaskNo(taskNo.shortValue()); // å·¥ä½å· |
| | | crnCommand.setTaskMode(DualCrnTaskModeType.PICK.id.shortValue()); // 任塿¨¡å¼: åè´§ |
| | | crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo)); // ç®æ åºä½æ |
| | | crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo)); // ç®æ åºä½å |
| | | crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo)); // ç®æ åºä½å± |
| | | crnCommand.setStation(station.shortValue());//å·¥ä½ |
| | | crnCommand.setCommand((short) 1); // ä»»å¡ç¡®è®¤ |
| | | crnCommand.setTaskNo(taskNo); // å·¥ä½å· |
| | | crnCommand.setTaskMode(DualCrnTaskModeType.PICK.id); // 任塿¨¡å¼: åè´§ |
| | | crnCommand.setDestinationPosX(Utils.getRow(targetLocNo)); // ç®æ åºä½æ |
| | | crnCommand.setDestinationPosY(Utils.getBay(targetLocNo)); // ç®æ åºä½å |
| | | crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo)); // ç®æ åºä½å± |
| | | crnCommand.setStation(station);//å·¥ä½ |
| | | crnCommand.setCommand(1); // ä»»å¡ç¡®è®¤ |
| | | return crnCommand; |
| | | } |
| | | |
| | |
| | | public DualCrnCommand getPutCommand(String targetLocNo, Integer taskNo, Integer crnNo, Integer station) { |
| | | DualCrnCommand crnCommand = new DualCrnCommand(); |
| | | crnCommand.setCrnNo(crnNo); // å åæºç¼å· |
| | | crnCommand.setTaskNo(taskNo.shortValue()); // å·¥ä½å· |
| | | crnCommand.setTaskMode(DualCrnTaskModeType.PUT.id.shortValue()); // 任塿¨¡å¼: æ¾è´§ |
| | | crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo)); // ç®æ åºä½æ |
| | | crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo)); // ç®æ åºä½å |
| | | crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo)); // ç®æ åºä½å± |
| | | crnCommand.setStation(station.shortValue());//å·¥ä½ |
| | | crnCommand.setCommand((short) 1); // ä»»å¡ç¡®è®¤ |
| | | crnCommand.setTaskNo(taskNo); // å·¥ä½å· |
| | | crnCommand.setTaskMode(DualCrnTaskModeType.PUT.id); // 任塿¨¡å¼: æ¾è´§ |
| | | crnCommand.setDestinationPosX(Utils.getRow(targetLocNo)); // ç®æ åºä½æ |
| | | crnCommand.setDestinationPosY(Utils.getBay(targetLocNo)); // ç®æ åºä½å |
| | | crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo)); // ç®æ åºä½å± |
| | | crnCommand.setStation(station);//å·¥ä½ |
| | | crnCommand.setCommand(1); // ä»»å¡ç¡®è®¤ |
| | | return crnCommand; |
| | | } |
| | | |
| | |
| | | public DualCrnCommand getMoveCommand(String targetLocNo, Integer taskNo, Integer crnNo) { |
| | | DualCrnCommand crnCommand = new DualCrnCommand(); |
| | | crnCommand.setCrnNo(crnNo); // å åæºç¼å· |
| | | crnCommand.setTaskNo(taskNo.shortValue()); // å·¥ä½å· |
| | | crnCommand.setTaskMode(DualCrnTaskModeType.MOVE.id.shortValue()); // 任塿¨¡å¼: å åæºç§»å¨ |
| | | crnCommand.setDestinationPosX((short) Utils.getRow(targetLocNo)); // ç®æ åºä½æ |
| | | crnCommand.setDestinationPosY((short) Utils.getBay(targetLocNo)); // ç®æ åºä½å |
| | | crnCommand.setDestinationPosZ((short) Utils.getLev(targetLocNo)); // ç®æ åºä½å± |
| | | crnCommand.setCommand((short) 1); // ä»»å¡ç¡®è®¤ |
| | | crnCommand.setTaskNo(taskNo); // å·¥ä½å· |
| | | crnCommand.setTaskMode(DualCrnTaskModeType.MOVE.id); // 任塿¨¡å¼: å åæºç§»å¨ |
| | | crnCommand.setDestinationPosX(Utils.getRow(targetLocNo)); // ç®æ åºä½æ |
| | | crnCommand.setDestinationPosY(Utils.getBay(targetLocNo)); // ç®æ åºä½å |
| | | crnCommand.setDestinationPosZ(Utils.getLev(targetLocNo)); // ç®æ åºä½å± |
| | | crnCommand.setCommand(1); // ä»»å¡ç¡®è®¤ |
| | | return crnCommand; |
| | | } |
| | | |
| | |
| | | public DualCrnCommand getResetCommand(Integer crnNo, Integer station) { |
| | | DualCrnCommand crnCommand = new DualCrnCommand(); |
| | | crnCommand.setCrnNo(crnNo); // å åæºç¼å· |
| | | crnCommand.setTaskNo((short) 0); // å·¥ä½å· |
| | | crnCommand.setTaskMode(DualCrnTaskModeType.CONFIRM.id.shortValue()); // 任塿¨¡å¼: 确认 |
| | | crnCommand.setSourcePosX((short)0); // æºåºä½æ |
| | | crnCommand.setSourcePosY((short)0); // æºåºä½å |
| | | crnCommand.setSourcePosZ((short)0); // æºåºä½å± |
| | | crnCommand.setDestinationPosX((short)0); // ç®æ åºä½æ |
| | | crnCommand.setDestinationPosY((short)0); // ç®æ åºä½å |
| | | crnCommand.setDestinationPosZ((short)0); // ç®æ åºä½å± |
| | | crnCommand.setStation(station.shortValue());//å·¥ä½ |
| | | crnCommand.setCommand((short) 1); // ä»»å¡ç¡®è®¤ |
| | | crnCommand.setTaskNo(0); // å·¥ä½å· |
| | | crnCommand.setTaskMode(DualCrnTaskModeType.CONFIRM.id); // 任塿¨¡å¼: 确认 |
| | | crnCommand.setSourcePosX(0); // æºåºä½æ |
| | | crnCommand.setSourcePosY(0); // æºåºä½å |
| | | crnCommand.setSourcePosZ(0); // æºåºä½å± |
| | | crnCommand.setDestinationPosX(0); // ç®æ åºä½æ |
| | | crnCommand.setDestinationPosY(0); // ç®æ åºä½å |
| | | crnCommand.setDestinationPosZ(0); // ç®æ åºä½å± |
| | | crnCommand.setStation(station);//å·¥ä½ |
| | | crnCommand.setCommand(1); // ä»»å¡ç¡®è®¤ |
| | | return crnCommand; |
| | | } |
| | | |
| | |
| | | |
| | | import java.text.MessageFormat; |
| | | import java.util.*; |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.ThreadFactory; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | import lombok.Data; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | private ZyStationConnectDriver zyStationConnectDriver; |
| | | private int deviceLogCollectTime = 200; |
| | | private long deviceDataLogTime = System.currentTimeMillis(); |
| | | private volatile boolean closed = false; |
| | | private ScheduledExecutorService readExecutor; |
| | | private ScheduledExecutorService processExecutor; |
| | | |
| | | public ZyStationThread(DeviceConfig deviceConfig, RedisUtil redisUtil) { |
| | | this.deviceConfig = deviceConfig; |
| | |
| | | this.connect(); |
| | | deviceLogCollectTime = Utils.getDeviceLogCollectTime(); |
| | | |
| | | readExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | Thread t = new Thread(r); |
| | | t.setName("DevpReader-" + deviceConfig.getDeviceNo()); |
| | | t.setDaemon(true); |
| | | return t; |
| | | } |
| | | }); |
| | | readExecutor.scheduleAtFixedRate(() -> { |
| | | if (closed || Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | | Thread readThread = new Thread(() -> { |
| | | while (true) { |
| | | try { |
| | | deviceLogCollectTime = Utils.getDeviceLogCollectTime(); |
| | | readStatus(); |
| | | Thread.sleep(100); |
| | | } catch (Exception e) { |
| | | log.error("StationThread Fail", e); |
| | | } |
| | | }, 0, 200, TimeUnit.MILLISECONDS); |
| | | |
| | | processExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | Thread t = new Thread(r); |
| | | t.setName("DevpWriter-" + deviceConfig.getDeviceNo()); |
| | | t.setDaemon(true); |
| | | return t; |
| | | } |
| | | }); |
| | | processExecutor.scheduleAtFixedRate(() -> { |
| | | if (closed || Thread.currentThread().isInterrupted()) { |
| | | return; |
| | | } |
| | | readThread.start(); |
| | | |
| | | Thread processThread = new Thread(() -> { |
| | | while (true) { |
| | | try { |
| | | int step = 1; |
| | | Task task = MessageQueue.poll(SlaveType.Devp, deviceConfig.getDeviceNo()); |
| | |
| | | if (step == 2) { |
| | | sendCommand((StationCommand) task.getData()); |
| | | } |
| | | |
| | | Thread.sleep(100); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | log.error("StationProcess Fail", e); |
| | | } |
| | | }, 0, 200, TimeUnit.MILLISECONDS); |
| | | } |
| | | }); |
| | | processThread.start(); |
| | | } |
| | | |
| | | private void readStatus() { |
| | |
| | | |
| | | @Override |
| | | public void close() { |
| | | closed = true; |
| | | ScheduledExecutorService ex = readExecutor; |
| | | if (ex != null) { |
| | | try { ex.shutdownNow(); } catch (Exception ignore) {} |
| | | } |
| | | ScheduledExecutorService px = processExecutor; |
| | | if (px != null) { |
| | | try { px.shutdownNow(); } catch (Exception ignore) {} |
| | | } |
| | | if (zyStationConnectDriver != null) { |
| | | zyStationConnectDriver.close(); |
| | | } |
| | |
| | | } |
| | | |
| | | if(wrkMast.getWrkSts() != WrkStsType.INBOUND_DEVICE_RUN.sts){ |
| | | News.taskInfo(stationProtocol.getTaskNo(), "å·¥ä½å·:{} ä»»å¡ç¶æå¼å¸¸", stationProtocol.getTaskNo()); |
| | | continue; |
| | | } |
| | | |
| | |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.alibaba.fastjson.serializer.SerializerFeature; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.domain.param.CreateLocMoveTaskParam; |
| | | import com.zy.asrs.entity.BasCrnp; |
| | | import com.zy.asrs.entity.BasDualCrnp; |
| | | import com.zy.asrs.entity.LocMast; |
| | | import com.zy.asrs.entity.WrkMast; |
| | |
| | | import com.zy.core.enums.*; |
| | | import com.zy.core.model.StationObjModel; |
| | | import com.zy.core.model.Task; |
| | | import com.zy.core.model.command.CrnCommand; |
| | | import com.zy.core.model.command.DualCrnCommand; |
| | | import com.zy.core.model.protocol.CrnProtocol; |
| | | import com.zy.core.model.command.StationCommand; |
| | | import com.zy.core.model.protocol.DualCrnProtocol; |
| | | import com.zy.core.model.protocol.StationProtocol; |
| | | import com.zy.core.thread.CrnThread; |
| | | import com.zy.core.thread.DualCrnThread; |
| | | import com.zy.core.thread.StationThread; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.ArrayList; |
| | |
| | | @Component |
| | | public class DualCrnOperateProcessUtils { |
| | | |
| | | @Value("${mainProcessPlugin}") |
| | | private String mainProcessPlugin; |
| | | @Autowired |
| | | private WrkMastService wrkMastService; |
| | | @Autowired |
| | |
| | | private CommonService commonService; |
| | | |
| | | //å
¥åºåº ===>> åå·¥ä½å åæºå
¥åºåºä½ä¸ä¸å |
| | | public synchronized void dualRrnIoExecute() { |
| | | public synchronized void dualCrnIoExecute() { |
| | | List<BasDualCrnp> basDualCrnps = basDualCrnpService.selectList(new EntityWrapper<>()); |
| | | for (BasDualCrnp basDualCrnp : basDualCrnps) { |
| | | DualCrnThread dualCrnThread = (DualCrnThread) SlaveConnection.get(SlaveType.DualCrn, basDualCrnp.getCrnNo()); |
| | |
| | | continue; |
| | | } |
| | | |
| | | int executeTaskNo = 0; |
| | | if (dualCrnProtocol.getTaskNo() > 0) { |
| | | executeTaskNo = dualCrnProtocol.getTaskNo(); |
| | | } |
| | | if (dualCrnProtocol.getTaskNoTwo() > 0) { |
| | | executeTaskNo = dualCrnProtocol.getTaskNoTwo(); |
| | | } |
| | | |
| | | if (executeTaskNo > 0) { |
| | | WrkMast wrkMast = wrkMastService.selectByWorkNo(executeTaskNo); |
| | | if (wrkMast != null) { |
| | | if (wrkMast.getIoType().equals(WrkIoType.IN.id)) { |
| | | this.crnExecuteIn(basDualCrnp, dualCrnThread); // å
¥åº |
| | | } else if (wrkMast.getIoType().equals(WrkIoType.OUT.id)) { |
| | | this.crnExecuteOut(basDualCrnp, dualCrnThread); // åºåº |
| | | }else { |
| | | continue; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 妿æè¿ä¸æ¬¡æ¯å
¥åºæ¨¡å¼ |
| | | if (dualCrnProtocol.getLastIo().equals("I")) { |
| | | if (basDualCrnp.getInEnable().equals("Y")) { |
| | | this.crnExecuteIn(basDualCrnp, dualCrnThread); // å
¥åº |
| | | dualCrnProtocol.setLastIo("O"); |
| | | } else if (basDualCrnp.getOutEnable().equals("Y")) { |
| | | this.crnExecuteOut(basDualCrnp, dualCrnThread); // åºåº |
| | | dualCrnProtocol.setLastIo("I"); |
| | | } |
| | | } |
| | | // 妿æè¿ä¸æ¬¡æ¯åºåºæ¨¡å¼ |
| | | else if (dualCrnProtocol.getLastIo().equals("O")) { |
| | | if (basDualCrnp.getOutEnable().equals("Y")) { |
| | | this.crnExecuteOut(basDualCrnp, dualCrnThread); // åºåº |
| | | dualCrnProtocol.setLastIo("I"); |
| | | } else if (basDualCrnp.getInEnable().equals("Y")) { |
| | | this.crnExecuteIn(basDualCrnp, dualCrnThread); // å
¥åº |
| | | dualCrnProtocol.setLastIo("O"); |
| | | } |
| | | } |
| | | this.crnExecute(basDualCrnp, dualCrnThread); |
| | | } |
| | | } |
| | | |
| | | private synchronized void crnExecuteIn(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) { |
| | | private synchronized void crnExecute(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) { |
| | | DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus(); |
| | | if(dualCrnProtocol == null){ |
| | | return; |
| | | } |
| | | |
| | | List<WrkMast> allTaskList = new ArrayList<>(); |
| | | List<WrkMast> inTaskList = getInTaskList(basDualCrnp); |
| | | List<WrkMast> outTaskList = getOutTaskList(basDualCrnp); |
| | | List<WrkMast> locMoveTaskList = getLocMoveTaskList(basDualCrnp); |
| | | |
| | | if (!locMoveTaskList.isEmpty()) { |
| | | allTaskList.addAll(locMoveTaskList); |
| | | } |
| | | |
| | | // 妿æè¿ä¸æ¬¡æ¯åºåºæ¨¡å¼ |
| | | if (dualCrnProtocol.getLastIo().equals("O")) { |
| | | allTaskList.addAll(inTaskList); |
| | | allTaskList.addAll(outTaskList); |
| | | } |
| | | // 妿æè¿ä¸æ¬¡æ¯å
¥åºæ¨¡å¼ |
| | | else if (dualCrnProtocol.getLastIo().equals("I")) { |
| | | allTaskList.addAll(outTaskList); |
| | | allTaskList.addAll(inTaskList); |
| | | } |
| | | |
| | | for (WrkMast wrkMast : allTaskList) { |
| | | if (wrkMast.getIoType() == WrkIoType.IN.id) { |
| | | boolean result = this.crnExecuteIn(basDualCrnp, dualCrnThread, wrkMast); |
| | | if (result) { |
| | | break; |
| | | } |
| | | } else if (wrkMast.getIoType() == WrkIoType.OUT.id) { |
| | | boolean result = this.crnExecuteOut(basDualCrnp, dualCrnThread, wrkMast); |
| | | if (result) { |
| | | break; |
| | | } |
| | | } else if (wrkMast.getIoType() == WrkIoType.LOC_MOVE.id) { |
| | | boolean result = this.crnExecuteLocMove(basDualCrnp, dualCrnThread, wrkMast); |
| | | if (result) { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | private List<WrkMast> getInTaskList(BasDualCrnp basDualCrnp) { |
| | | List<WrkMast> list = new ArrayList<>(); |
| | | if(!basDualCrnp.getInEnable().equals("Y")){ |
| | | News.info("åå·¥ä½å åæº:{} å¯å
¥ä¿¡å·ä¸æ»¡è¶³", basDualCrnp.getCrnNo()); |
| | | return; |
| | | return list; |
| | | } |
| | | |
| | | List<StationObjModel> inStationList = basDualCrnp.getInStationList$(); |
| | | if(inStationList.isEmpty()){ |
| | | News.info("åå·¥ä½å åæº:{} å
¥åºç«ç¹æªè®¾ç½®", basDualCrnp.getCrnNo()); |
| | | return; |
| | | } |
| | | |
| | | Integer crnNo = basDualCrnp.getCrnNo(); |
| | | int station = calcStation(dualCrnProtocol); |
| | | if(station == 0){ |
| | | News.info("åå·¥ä½å åæº:{} æ å¯ç¨å·¥ä½", basDualCrnp.getCrnNo()); |
| | | return; |
| | | return list; |
| | | } |
| | | |
| | | for (StationObjModel stationObjModel : inStationList) { |
| | |
| | | } |
| | | |
| | | if(wrkMast.getWrkSts() != WrkStsType.INBOUND_DEVICE_RUN.sts){ |
| | | News.taskInfo(stationProtocol.getTaskNo(), "å·¥ä½å·:{} ä»»å¡ç¶æå¼å¸¸", stationProtocol.getTaskNo()); |
| | | continue; |
| | | } |
| | | |
| | | list.add(wrkMast); |
| | | } |
| | | |
| | | return list; |
| | | } |
| | | |
| | | private List<WrkMast> getOutTaskList(BasDualCrnp basDualCrnp) { |
| | | List<WrkMast> list = new ArrayList<>(); |
| | | if(!basDualCrnp.getOutEnable().equals("Y")){ |
| | | News.info("åå·¥ä½å åæº:{} å¯åºä¿¡å·ä¸æ»¡è¶³", basDualCrnp.getCrnNo()); |
| | | return list; |
| | | } |
| | | |
| | | List<StationObjModel> outStationList = basDualCrnp.getOutStationList$(); |
| | | if(outStationList.isEmpty()){ |
| | | News.info("åå·¥ä½å åæº:{} åºåºç«ç¹æªè®¾ç½®", basDualCrnp.getCrnNo()); |
| | | return list; |
| | | } |
| | | |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() |
| | | .eq("dual_crn_no", basDualCrnp.getCrnNo()) |
| | | .eq("wrk_sts", WrkStsType.NEW_OUTBOUND.sts) |
| | | ); |
| | | list.addAll(wrkMasts); |
| | | return list; |
| | | } |
| | | |
| | | private List<WrkMast> getLocMoveTaskList(BasDualCrnp basDualCrnp) { |
| | | List<WrkMast> list = new ArrayList<>(); |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() |
| | | .eq("dual_crn_no", basDualCrnp.getCrnNo()) |
| | | .eq("wrk_sts", WrkStsType.NEW_LOC_MOVE.sts) |
| | | ); |
| | | list.addAll(wrkMasts); |
| | | return list; |
| | | } |
| | | |
| | | private synchronized boolean crnExecuteIn(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast) { |
| | | DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus(); |
| | | if (dualCrnProtocol == null) { |
| | | return false; |
| | | } |
| | | |
| | | if (!basDualCrnp.getInEnable().equals("Y")) { |
| | | News.info("åå·¥ä½å åæº:{} å¯å
¥ä¿¡å·ä¸æ»¡è¶³", basDualCrnp.getCrnNo()); |
| | | return false; |
| | | } |
| | | |
| | | List<StationObjModel> inStationList = basDualCrnp.getInStationList$(); |
| | | if(inStationList.isEmpty()){ |
| | | News.info("åå·¥ä½å åæº:{} å
¥åºç«ç¹æªè®¾ç½®", basDualCrnp.getCrnNo()); |
| | | return false; |
| | | } |
| | | |
| | | Integer crnNo = basDualCrnp.getCrnNo(); |
| | | int station = calcStation(dualCrnProtocol, "in"); |
| | | if (station == 0) { |
| | | News.info("åå·¥ä½å åæº:{} æ å¯ç¨å·¥ä½", basDualCrnp.getCrnNo()); |
| | | return false; |
| | | } |
| | | |
| | | if (wrkMast.getWrkSts() != WrkStsType.INBOUND_DEVICE_RUN.sts) { |
| | | return false; |
| | | } |
| | | |
| | | // è·ååºä½ä¿¡æ¯ |
| | | LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); |
| | | if (locMast == null) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "ç®æ åºä½:{} ä¿¡æ¯ä¸åå¨", wrkMast.getLocNo()); |
| | | continue; |
| | | return false; |
| | | } |
| | | |
| | | if (!locMast.getLocSts().equals("S")) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "ç®æ åºä½:{} ç¶æå¼å¸¸", wrkMast.getLocNo()); |
| | | continue; |
| | | return false; |
| | | } |
| | | |
| | | //æ£æµæµ
åºä½ç¶æ |
| | | boolean checkStatus = checkShallowLocStatus(locMast.getLocNo(), wrkMast.getWrkNo()); |
| | | if (!checkStatus) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "å æµ
åºä½å µå¡æ æ³æ§è¡"); |
| | | return false; |
| | | } |
| | | |
| | | StationObjModel inStationObjModel = null; |
| | | for (StationObjModel stationObjModel : inStationList) { |
| | | StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo()); |
| | | if (stationThread == null) { |
| | | continue; |
| | | } |
| | | |
| | | String sourceLocNo = Utils.getLocNo(stationObjModel.getDeviceRow(), stationObjModel.getDeviceBay(), stationObjModel.getDeviceLev()); |
| | | Map<Integer, StationProtocol> stationProtocolMap = stationThread.getStatusMap(); |
| | | StationProtocol stationProtocol = stationProtocolMap.get(stationObjModel.getStationId()); |
| | | if (stationProtocol == null) { |
| | | continue; |
| | | } |
| | | |
| | | if (!stationProtocol.isAutoing()) { |
| | | continue; |
| | | } |
| | | |
| | | if (!stationProtocol.isLoading()) { |
| | | continue; |
| | | } |
| | | |
| | | if (stationProtocol.getTaskNo() <= 0) { |
| | | continue; |
| | | } |
| | | |
| | | if (!stationProtocol.isInEnable()) { |
| | | News.taskInfo(stationProtocol.getTaskNo(), "åè´§ç«ç¹:{} 没æå¯å
¥ä¿¡å·", stationObjModel.getStationId()); |
| | | continue; |
| | | } |
| | | |
| | | if (stationProtocol.getTaskNo().equals(wrkMast.getWrkNo())) { |
| | | inStationObjModel = stationObjModel; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (inStationObjModel == null) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "æªæç´¢å°åè´§ç«ç¹"); |
| | | return false; |
| | | } |
| | | |
| | | String sourceLocNo = Utils.getLocNo(inStationObjModel.getDeviceRow(), inStationObjModel.getDeviceBay(), inStationObjModel.getDeviceLev()); |
| | | |
| | | List<DualCrnCommand> commandList = new ArrayList<>(); |
| | | DualCrnCommand pickCommand = dualCrnThread.getPickCommand(sourceLocNo, wrkMast.getWrkNo(), crnNo, station); |
| | |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(2, commandList)); |
| | | News.info("åå·¥ä½å åæºå½ä»¤ä¸åæåï¼å åæºå·={}ï¼ä»»å¡æ°æ®={}", crnNo, JSON.toJSON(commandList)); |
| | | dualCrnProtocol.setLastIo("I"); |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | private synchronized void crnExecuteOut(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread) { |
| | | private synchronized boolean crnExecuteOut(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast) { |
| | | DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus(); |
| | | if(dualCrnProtocol == null){ |
| | | return; |
| | | return false; |
| | | } |
| | | |
| | | if(!basDualCrnp.getOutEnable().equals("Y")){ |
| | | News.info("åå·¥ä½å åæº:{} å¯åºä¿¡å·ä¸æ»¡è¶³", basDualCrnp.getCrnNo()); |
| | | return; |
| | | return false; |
| | | } |
| | | |
| | | List<StationObjModel> outStationList = basDualCrnp.getOutStationList$(); |
| | | if(outStationList.isEmpty()){ |
| | | News.info("åå·¥ä½å åæº:{} åºåºç«ç¹æªè®¾ç½®", basDualCrnp.getCrnNo()); |
| | | return; |
| | | return false; |
| | | } |
| | | |
| | | Integer crnNo = basDualCrnp.getCrnNo(); |
| | | int station = calcStation(dualCrnProtocol); |
| | | int station = calcStation(dualCrnProtocol, "out"); |
| | | if(station == 0){ |
| | | News.info("åå·¥ä½å åæº:{} æ å¯ç¨å·¥ä½", basDualCrnp.getCrnNo()); |
| | | return; |
| | | return false; |
| | | } |
| | | |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() |
| | | .eq("crn_no", crnNo) |
| | | .eq("wrk_sts", WrkStsType.NEW_OUTBOUND.sts) |
| | | ); |
| | | |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | for (StationObjModel stationObjModel : outStationList) { |
| | | StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo()); |
| | | if (stationThread == null) { |
| | |
| | | wrkMast.setIoTime(new Date()); |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(2, commandList)); |
| | | //åè´§åçå¾
ä¸ä¸ä¸ªä»»å¡æ¶é¿ |
| | | redisUtil.set(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + crnNo, "wait", 5); |
| | | News.info("åå·¥ä½å åæºå½ä»¤ä¸åæåï¼å åæºå·={}ï¼ä»»å¡æ°æ®={}", crnNo, JSON.toJSON(commandList)); |
| | | return; |
| | | dualCrnProtocol.setLastIo("O"); |
| | | |
| | | redisUtil.set(RedisKeyType.DUAL_CRN_OUT_TASK_STATION_INFO.key + wrkMast.getWrkNo(), JSON.toJSONString(stationObjModel, SerializerFeature.DisableCircularReferenceDetect), 60 * 60 * 24); |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | private synchronized boolean crnExecuteLocMove(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast) { |
| | | DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus(); |
| | | if (dualCrnProtocol == null) { |
| | | return false; |
| | | } |
| | | |
| | | Integer crnNo = basDualCrnp.getCrnNo(); |
| | | int station = calcStation(dualCrnProtocol, "locMove"); |
| | | if (station == 0) { |
| | | News.info("åå·¥ä½å åæº:{} æ å¯ç¨å·¥ä½", basDualCrnp.getCrnNo()); |
| | | return false; |
| | | } |
| | | |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() |
| | | .eq("crn_no", crnNo) |
| | | .eq("wrk_sts", WrkStsType.NEW_LOC_MOVE.sts) |
| | | ); |
| | | |
| | | // è·åæºåºä½ä¿¡æ¯ |
| | | LocMast sourceLocMast = locMastService.selectById(wrkMast.getSourceLocNo()); |
| | | if (sourceLocMast == null) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "æºåºä½:{} ä¿¡æ¯ä¸åå¨", wrkMast.getSourceLocNo()); |
| | | return false; |
| | | } |
| | | |
| | | if(!sourceLocMast.getLocSts().equals("R")){ |
| | | News.taskInfo(wrkMast.getWrkNo(), "æºåºä½:{} ç¶æå¼å¸¸ï¼ä¸å±äºåºåºé¢çº¦ç¶æ", wrkMast.getSourceLocNo()); |
| | | return false; |
| | | } |
| | | |
| | | // è·ååºä½ä¿¡æ¯ |
| | | LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); |
| | | if (locMast == null) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "åºä½:{} ä¿¡æ¯ä¸åå¨", wrkMast.getLocNo()); |
| | | return false; |
| | | } |
| | | |
| | | if (!locMast.getLocSts().equals("S")) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "åºä½:{} ç¶æå¼å¸¸ï¼ä¸å±äºå
¥åºé¢çº¦ç¶æ", wrkMast.getLocNo()); |
| | | return false; |
| | | } |
| | | |
| | | //æ£æµæµ
åºä½ç¶æ |
| | | boolean checkStatus = checkShallowLocStatus(locMast.getLocNo(), wrkMast.getWrkNo()); |
| | | if (!checkStatus) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "å æµ
åºä½å µå¡æ æ³æ§è¡"); |
| | | return false; |
| | | } |
| | | |
| | | List<DualCrnCommand> commandList = new ArrayList<>(); |
| | | DualCrnCommand pickCommand = dualCrnThread.getPickCommand(wrkMast.getSourceLocNo(), wrkMast.getWrkNo(), crnNo, station); |
| | | DualCrnCommand putCommand = dualCrnThread.getPutCommand(wrkMast.getLocNo(), wrkMast.getWrkNo(), crnNo, station); |
| | | commandList.add(pickCommand); |
| | | commandList.add(putCommand); |
| | | |
| | | wrkMast.setWrkSts(WrkStsType.LOC_MOVE_RUN.sts); |
| | | wrkMast.setDualCrnNo(crnNo); |
| | | wrkMast.setSystemMsg(""); |
| | | wrkMast.setIoTime(new Date()); |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | MessageQueue.offer(SlaveType.DualCrn, crnNo, new Task(2, commandList)); |
| | | News.info("åå·¥ä½å åæºå½ä»¤ä¸åæåï¼å åæºå·={}ï¼ä»»å¡æ°æ®={}", crnNo, JSON.toJSON(commandList)); |
| | | dualCrnProtocol.setLastIo("I"); |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | //åå·¥ä½å åæºä»»å¡æ§è¡å®æ |
| | |
| | | |
| | | if(dualCrnProtocol.getTaskNo() > 0 && dualCrnProtocol.getStatus() == DualCrnStatusType.WAITING.id) { |
| | | executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNo(), 1); |
| | | continue; |
| | | } |
| | | |
| | | if(dualCrnProtocol.getTaskNoTwo() > 0 && dualCrnProtocol.getStatusTwo() == DualCrnStatusType.WAITING.id) { |
| | | executeFinish(basDualCrnp, dualCrnThread, dualCrnProtocol, dualCrnProtocol.getTaskNoTwo(), 2); |
| | | continue; |
| | | } |
| | | } |
| | | } |
| | |
| | | updateWrkSts = WrkStsType.COMPLETE_INBOUND.sts; |
| | | } else if (wrkMast.getWrkSts() == WrkStsType.OUTBOUND_RUN.sts) { |
| | | updateWrkSts = WrkStsType.OUTBOUND_RUN_COMPLETE.sts; |
| | | |
| | | if(mainProcessPlugin.contains("Fake")) { |
| | | //çæä»¿çç«ç¹æ°æ® |
| | | List<StationObjModel> outStationList = basDualCrnp.getOutStationList$(); |
| | | if(outStationList.isEmpty()){ |
| | | News.info("åå·¥ä½å åæº:{} åºåºç«ç¹æªè®¾ç½®", basDualCrnp.getCrnNo()); |
| | | return; |
| | | } |
| | | |
| | | for (StationObjModel stationObjModel : outStationList) { |
| | | if (!stationObjModel.getStationId().equals(wrkMast.getSourceStaNo())) { |
| | | continue; |
| | | } |
| | | |
| | | StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo()); |
| | | if (stationThread == null) { |
| | | continue; |
| | | } |
| | | //çæä»¿çç«ç¹æ°æ® |
| | | StationCommand command = stationThread.getMoveCommand(9998, wrkMast.getSourceStaNo(), 0, 0); |
| | | MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command)); |
| | | } |
| | | } |
| | | |
| | | } else if (wrkMast.getWrkSts() == WrkStsType.LOC_MOVE_RUN.sts) { |
| | | updateWrkSts = WrkStsType.COMPLETE_LOC_MOVE.sts; |
| | | } else { |
| | |
| | | return; |
| | | } |
| | | |
| | | DualCrnCommand resetCommand = dualCrnThread.getResetCommand(dualCrnProtocol.getCrnNo(), station); |
| | | boolean offer = MessageQueue.offer(SlaveType.DualCrn, dualCrnProtocol.getCrnNo(), new Task(3, resetCommand)); |
| | | if (offer) { |
| | | wrkMast.setWrkSts(updateWrkSts); |
| | | wrkMast.setSystemMsg(""); |
| | | wrkMast.setIoTime(new Date()); |
| | | if (wrkMastService.updateById(wrkMast)) { |
| | | DualCrnCommand resetCommand = dualCrnThread.getResetCommand(dualCrnProtocol.getCrnNo(), station); |
| | | MessageQueue.offer(SlaveType.DualCrn, dualCrnProtocol.getCrnNo(), new Task(3, resetCommand)); |
| | | News.info("åå·¥ä½å åæºä»»å¡ç¶ææ´æ°æåï¼å åæºå·={}ï¼å·¥ä½å·={}", basDualCrnp.getCrnNo(), taskNo); |
| | | } |
| | | redisUtil.set(RedisKeyType.DUAL_CRN_IO_EXECUTE_FINISH_LIMIT.key + basDualCrnp.getCrnNo() + "_" + taskNo, "lock", 10); |
| | | } |
| | | }else { |
| | | DualCrnCommand command = commandList.get(idx - 1); |
| | | if (command.getTaskMode() == DualCrnTaskModeType.PICK.id.shortValue()) { |
| | | //åè´§åçå¾
ä¸ä¸ä¸ªä»»å¡æ¶é¿ |
| | | redisUtil.set(RedisKeyType.DUAL_CRN_PICK_WAIT_NEXT_TASK.key + basDualCrnp.getCrnNo(), "wait", 10); |
| | | } |
| | | |
| | | DualCrnCommand resetCommand = dualCrnThread.getResetCommand(dualCrnProtocol.getCrnNo(), station); |
| | | MessageQueue.offer(SlaveType.DualCrn, dualCrnProtocol.getCrnNo(), new Task(3, resetCommand)); |
| | | News.info("åå·¥ä½å åæºå½ä»¤å®æç¡®è®¤æåï¼å åæºå·={}ï¼å·¥ä½å·={}", basDualCrnp.getCrnNo(), taskNo); |
| | |
| | | return false; |
| | | } |
| | | |
| | | private int calcStation(DualCrnProtocol dualCrnProtocol) { |
| | | int station = 0; |
| | | if(dualCrnProtocol.getTaskNo() == 0){ |
| | | station = 1; |
| | | }else if (dualCrnProtocol.getTaskNoTwo() == 0){ |
| | | station = 2; |
| | | private int calcStation(DualCrnProtocol dualCrnProtocol, String type) { |
| | | List<Integer> idleStationList = new ArrayList<>(); |
| | | |
| | | if (dualCrnProtocol.getTaskNo() == 0 |
| | | && dualCrnProtocol.getLoaded() == 0 |
| | | && dualCrnProtocol.getStatusType().equals(DualCrnStatusType.IDLE) |
| | | ) { |
| | | idleStationList.add(1); |
| | | } |
| | | |
| | | return station; |
| | | if (dualCrnProtocol.getTaskNoTwo() == 0 |
| | | && dualCrnProtocol.getLoadedTwo() == 0 |
| | | && dualCrnProtocol.getStatusTypeTwo().equals(DualCrnStatusType.IDLE) |
| | | ) { |
| | | idleStationList.add(2); |
| | | } |
| | | |
| | | if (type.equals("locMove")) { |
| | | if (idleStationList.size() != 2) { |
| | | return 0; |
| | | } |
| | | return idleStationList.get(0); |
| | | } |
| | | |
| | | if (idleStationList.size() == 2) { |
| | | return idleStationList.get(0); |
| | | } |
| | | |
| | | Integer idleStation = idleStationList.get(0); |
| | | int workingStation = idleStation == 1 ? 2 : 1; |
| | | |
| | | int executeTaskNo = 0; |
| | | if (workingStation == 1) { |
| | | executeTaskNo = dualCrnProtocol.getTaskNo(); |
| | | //æ£æµå·¥ä½å·²è¿å
¥æ¾è´§é¶æ®µï¼æ¾è´§é¶æ®µä¸æ¥æ°ä»»å¡ |
| | | if (dualCrnProtocol.getStatusType().equals(DualCrnStatusType.PUT_MOVING) |
| | | || dualCrnProtocol.getStatusType().equals(DualCrnStatusType.PUTTING) |
| | | || dualCrnProtocol.getStatusType().equals(DualCrnStatusType.WAITING) |
| | | ) { |
| | | return 0; |
| | | } |
| | | } else { |
| | | executeTaskNo = dualCrnProtocol.getTaskNoTwo(); |
| | | //æ£æµå·¥ä½å·²è¿å
¥æ¾è´§é¶æ®µï¼æ¾è´§é¶æ®µä¸æ¥æ°ä»»å¡ |
| | | if (dualCrnProtocol.getStatusTypeTwo().equals(DualCrnStatusType.PUT_MOVING) |
| | | || dualCrnProtocol.getStatusTypeTwo().equals(DualCrnStatusType.PUTTING) |
| | | || dualCrnProtocol.getStatusTypeTwo().equals(DualCrnStatusType.WAITING) |
| | | ) { |
| | | return 0; |
| | | } |
| | | } |
| | | |
| | | if (executeTaskNo == 0) { |
| | | return 0; |
| | | } |
| | | |
| | | WrkMast wrkMast = wrkMastService.selectByWorkNo(executeTaskNo); |
| | | if (wrkMast.getIoType().equals(WrkIoType.IN.id) && type.equals("in")) { |
| | | return idleStation; |
| | | } |
| | | |
| | | if (wrkMast.getIoType().equals(WrkIoType.OUT.id) && type.equals("out")) { |
| | | return idleStation; |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | } |
| | |
| | | @Autowired |
| | | private BasCrnpService basCrnpService; |
| | | @Autowired |
| | | private BasDualCrnpService basDualCrnpService; |
| | | @Autowired |
| | | private RedisUtil redisUtil; |
| | | @Autowired |
| | | private LocMastService locMastService; |
| | |
| | | public synchronized void stationOutExecute() { |
| | | List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", WrkStsType.OUTBOUND_RUN_COMPLETE.sts)); |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | BasCrnp basCrnp = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", wrkMast.getCrnNo())); |
| | | if (basCrnp == null) { |
| | | continue; |
| | | } |
| | | List<StationObjModel> outStationList = new ArrayList<>(); |
| | | |
| | | List<StationObjModel> outStationList = basCrnp.getOutStationList$(); |
| | | BasCrnp basCrnp = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", wrkMast.getCrnNo())); |
| | | if (basCrnp != null) { |
| | | outStationList = basCrnp.getOutStationList$(); |
| | | if(outStationList.isEmpty()){ |
| | | News.info("å åæº:{} åºåºç«ç¹æªè®¾ç½®", basCrnp.getCrnNo()); |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | BasDualCrnp basDualCrnp = basDualCrnpService.selectOne(new EntityWrapper<BasDualCrnp>().eq("crn_no", wrkMast.getDualCrnNo())); |
| | | if (basDualCrnp != null) { |
| | | outStationList = basDualCrnp.getOutStationList$(); |
| | | if(outStationList.isEmpty()){ |
| | | News.info("åå·¥ä½å åæº:{} åºåºç«ç¹æªè®¾ç½®", basDualCrnp.getCrnNo()); |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | for (StationObjModel stationObjModel : outStationList) { |
| | |
| | | MessageQueue.offer(SlaveType.Devp, stationObjModel.getDeviceNo(), new Task(2, command)); |
| | | News.info("è¾éç«ç¹åºåºå½ä»¤ä¸åæåï¼ç«ç¹å·={}ï¼å·¥ä½å·={}ï¼å½ä»¤æ°æ®={}", stationProtocol.getStationId(), wrkMast.getWrkNo(), JSON.toJSONString(command)); |
| | | redisUtil.set(RedisKeyType.STATION_OUT_EXECUTE_LIMIT.key + stationProtocol.getStationId(), "lock", 5); |
| | | redisUtil.set(RedisKeyType.STATION_OUT_EXECUTE_COMPLETE_LIMIT.key + wrkMast.getWrkNo(), "lock", 60 * 5); |
| | | } |
| | | } |
| | | } |
| | |
| | | for (WrkMast wrkMast : wrkMasts) { |
| | | Integer wrkNo = wrkMast.getWrkNo(); |
| | | |
| | | Object lock = redisUtil.get(RedisKeyType.STATION_OUT_EXECUTE_COMPLETE_LIMIT.key + wrkNo); |
| | | if (lock != null) { |
| | | continue; |
| | | } |
| | | |
| | | boolean complete = true; |
| | | List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>()); |
| | | for (BasDevp basDevp : basDevps) { |
| | |
| | | <el-descriptions-item label="å·¥ä½2ç¶æ">{{ item.statusTwo }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½1æ¯å¦æç©">{{ item.loading }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½2æ¯å¦æç©">{{ item.loadingTwo }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½1å">{{ item.bay }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½2å">{{ item.bayTwo }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½1å±">{{ item.lev }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½2å±">{{ item.levTwo }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½1è´§åå®ä½">{{ item.forkOffset }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½2è´§åå®ä½">{{ item.forkOffsetTwo }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½1载货å°å®ä½">{{ item.liftPos }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½2载货å°å®ä½">{{ item.liftPosTwo }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½1èµ°è¡å¨å®ä½">{{ item.walkPos }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½2èµ°è¡å¨å®ä½">{{ item.walkPosTwo }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½1任塿¥æ¶">{{ item.taskReceive }}</el-descriptions-item> |
| | | <el-descriptions-item label="å·¥ä½2任塿¥æ¶">{{ item.taskReceiveTwo }}</el-descriptions-item> |
| | | <el-descriptions-item label="å">{{ item.bay }}</el-descriptions-item> |
| | | <el-descriptions-item label="å±">{{ item.lev }}</el-descriptions-item> |
| | | <el-descriptions-item label="载货å°å®ä½">{{ item.liftPos }}</el-descriptions-item> |
| | | <el-descriptions-item label="èµ°è¡å¨å®ä½">{{ item.walkPos }}</el-descriptions-item> |
| | | <el-descriptions-item label="èµ°è¡é度ï¼m/min)">{{ item.xspeed }}</el-descriptions-item> |
| | | <el-descriptions-item label="åéé度ï¼m/min)">{{ item.yspeed }}</el-descriptions-item> |
| | | <el-descriptions-item label="åçé度ï¼m/min)">{{ item.zspeed }}</el-descriptions-item> |
| | |
| | | </el-drawer> |
| | | |
| | | <el-drawer |
| | | title="å°è½¦ä¿¡æ¯" |
| | | :visible.sync="drawerShuttle" |
| | | :with-header="true" |
| | | :modal="false" |
| | | > |
| | | <div v-if="drawerShuttleData!=null"> |
| | | <div style="margin: 10px;"> |
| | | <div style="margin-top: 5px;">å°è½¦ï¼{{drawerShuttleData.shuttleNo}}</div> |
| | | <div style="margin-top: 5px;">å·¥ä½å·ï¼{{drawerShuttleData.wrkNo}}</div> |
| | | <div style="margin-top: 5px;">ç¶æï¼{{drawerShuttleData}}</div> |
| | | </div> |
| | | </div> |
| | | </el-drawer> |
| | | |
| | | <el-drawer |
| | | title="ç«ç¹ä¿¡æ¯" |
| | | :visible.sync="drawerSta" |
| | | :with-header="true" |
| | |
| | | </div> |
| | | </el-drawer> |
| | | |
| | | <el-drawer |
| | | title="æåæºä¿¡æ¯" |
| | | :visible.sync="drawerLift" |
| | | :with-header="true" |
| | | :modal="false" |
| | | > |
| | | <div v-if="drawerLiftData!=null"> |
| | | <div style="margin: 10px;"> |
| | | <div style="margin-top: 5px;">æåæºï¼{{liftList[drawerLiftData-1].liftNo}}</div> |
| | | <div style="margin-top: 5px;">å·¥ä½å·ï¼{{liftList[drawerLiftData-1].taskNo}}</div> |
| | | <div style="margin-top: 5px;">ç¶æï¼{{liftList[drawerLiftData-1]}}</div> |
| | | </div> |
| | | </div> |
| | | </el-drawer> |
| | | |
| | | </div> |
| | | <script> |
| | | let width = 25; |
| | | let height = 25; |
| | | let pixiApp; |
| | | let pixiStageList = []; |
| | | let pixiShuttleMap = new Map(); |
| | | let pixiShuttleMoveAdvancePathMap = new Map(); |
| | | let pixiShuttleMoveAdvancePathList = []; |
| | | let pixiShuttleLockPathMap = new Map(); |
| | | let pixiStaMap = new Map(); |
| | | let objectsContainer; |
| | | let objectsContainer2; |
| | | let objectsContainer3; |
| | | let graphics0; |
| | | let graphics3; |
| | | let graphics4; |
| | |
| | | map: [], |
| | | currentLev: 1, |
| | | floorList: [], //å½åé¡¹ç®æ¥¼å± |
| | | currentLevShuttleList: [],//å½å楼å±ååç©¿æ¢è½¦éå |
| | | shuttleColorList: [],//ååç©¿æ¢è½¦é¢è²éå |
| | | drawer: false, |
| | | drawerLocNo: false, |
| | | drawerLocNoData: null, |
| | | drawerLocDetls: [], |
| | | reloadMap: true, |
| | | mapFps: 0, |
| | | drawerShuttle: false, |
| | | drawerShuttleData: null, |
| | | currentLevStaList: [],//å½å楼å±ç«ç¹list |
| | | reloadSta: true, |
| | | drawerSta: false, |
| | | drawerStaData: null, |
| | | drawerLift: false, |
| | | drawerLiftData: null, |
| | | liftList: [], |
| | | }, |
| | | mounted() { |
| | | this.init() |
| | |
| | | setTimeout(() => { |
| | | that.getMap(this.currentLev) |
| | | }, 1000); |
| | | |
| | | // this.consoleInterval = setInterval(() => { |
| | | // this.getMap(this.currentLev) //è·å宿¶å°å¾æ°æ® |
| | | // this.getShuttleStateInfo() //è·åååç©¿æ¢è½¦ä¿¡æ¯ |
| | | // this.getLiftStateInfo() //è·åæåæºä¿¡æ¯ |
| | | // this.getSiteInfo() //è·åè¾éç«ç¹æ°æ® |
| | | // // this.getCodeData()//è·åæ¡ç |
| | | // }, 1000) |
| | | |
| | | }, |
| | | initLev(){ |
| | |
| | | }, |
| | | changeFloor(lev) { |
| | | this.currentLev = lev |
| | | this.currentLevShuttleList = [] |
| | | this.reloadMap = true |
| | | this.reloadSta = true |
| | | this.getMap(lev) |
| | | |
| | | //æ¸
空å ç¨è·¯å¾ |
| | | objectsContainer3.removeChildren(); |
| | | pixiShuttleLockPathMap = new Map(); |
| | | |
| | | //æ¸
空é¢è®¡è·¯å¾ |
| | | objectsContainer2.removeChildren(); |
| | | pixiShuttleMoveAdvancePathMap = new Map(); |
| | | pixiShuttleMoveAdvancePathList = [] |
| | | }, |
| | | createMap(){ |
| | | //Create a Pixi Application |
| | |
| | | }); |
| | | //Add the canvas that Pixi automatically created for you to the HTML document |
| | | $("#pixiView").append(pixiApp.view) |
| | | |
| | | //å è½½å°è½¦èµæº |
| | | pixiApp.loader.add('shuttle', '../static/images/sxcar.png'); |
| | | |
| | | // ä»Graphics对象å建ä¸ä¸ªçº¹ç |
| | | graphicsF = pixiApp.renderer.generateTexture(getContainer(1000)); |
| | |
| | | // å建ä¸ä¸ªå®¹å¨æ¥ç®¡ç大æ¹éçæ¾ç¤ºå¯¹è±¡ |
| | | objectsContainer = new PIXI.Container(); |
| | | pixiApp.stage.addChild(objectsContainer); |
| | | |
| | | // å建ä¸ä¸ªå®¹å¨æ¥ç®¡ç大æ¹éçæ¾ç¤ºå¯¹è±¡ |
| | | objectsContainer2 = new PIXI.Container(); |
| | | pixiApp.stage.addChild(objectsContainer2); |
| | | |
| | | // å建ä¸ä¸ªå®¹å¨æ¥ç®¡ç大æ¹éçæ¾ç¤ºå¯¹è±¡ |
| | | objectsContainer3 = new PIXI.Container(); |
| | |
| | | //*******************缩æ¾ç»å¸******************* |
| | | |
| | | //*******************FPS******************* |
| | | var g_Time=0; |
| | | let g_Time = 0; |
| | | let fpsLastUpdateTs = 0; |
| | | let fpsDeltaSumMs = 0; |
| | | let fpsFrameCount = 0; |
| | | const fpsUpdateInterval = 200; |
| | | pixiApp.ticker.add((delta) => { |
| | | var timeNow = (new Date()).getTime(); |
| | | var timeDiff = timeNow - g_Time; |
| | | const timeNow = (new Date()).getTime(); |
| | | const timeDiff = timeNow - g_Time; |
| | | g_Time = timeNow; |
| | | var fps = 1000 / timeDiff; |
| | | this.mapFps = parseInt(fps) |
| | | fpsDeltaSumMs += timeDiff; |
| | | fpsFrameCount += 1; |
| | | if (timeNow - fpsLastUpdateTs >= fpsUpdateInterval) { |
| | | const avgFps = fpsDeltaSumMs > 0 ? (fpsFrameCount * 1000 / fpsDeltaSumMs) : 0; |
| | | this.mapFps = Math.round(avgFps); |
| | | fpsDeltaSumMs = 0; |
| | | fpsFrameCount = 0; |
| | | fpsLastUpdateTs = timeNow; |
| | | } |
| | | }); |
| | | //*******************FPS******************* |
| | | |
| | |
| | | if (val.value == 4) { |
| | | //ç«ç¹ |
| | | this.openDrawerSta(val) |
| | | } else if (val.value == 67) { |
| | | //æåæº |
| | | this.openDrawerLift(val) |
| | | } else { |
| | | //åºä½ |
| | | this.rightEvent(index, idx, e); |
| | |
| | | }); |
| | | |
| | | const b1 = objectsContainer.getLocalBounds(); |
| | | const b2 = objectsContainer2.getLocalBounds(); |
| | | const minX = Math.min(b1.x, b2.x); |
| | | const minY = Math.min(b1.y, b2.y); |
| | | const maxX = Math.max(b1.x + b1.width, b2.x + b2.width); |
| | | const maxY = Math.max(b1.y + b1.height, b2.y + b2.height); |
| | | const minX = Math.min(b1.x); |
| | | const minY = Math.min(b1.y); |
| | | const maxX = Math.max(b1.x + b1.width); |
| | | const maxY = Math.max(b1.y + b1.height); |
| | | const contentW = Math.max(0, maxX - minX); |
| | | const contentH = Math.max(0, maxY - minY); |
| | | const vw = pixiApp.view.width; |
| | |
| | | const posX = (vw - contentW * scale) / 2 - minX * scale; |
| | | const posY = (vh - contentH * scale) / 2 - minY * scale; |
| | | pixiApp.stage.setTransform(posX, posY, scale, scale, 0, 0, 0, 0, 0); |
| | | }else { |
| | | let diff = this.findDiffList(this.map, map); |
| | | diff.forEach((item, index) => { |
| | | //è·åoldå
ç´ |
| | | let oldSprite = pixiStageList[item.x][item.y] |
| | | if (item.originData == -999) { |
| | | //ç§»é¤oldè·¯å¾å
ç´ |
| | | objectsContainer3.removeChild(oldSprite); |
| | | }else { |
| | | //ç§»é¤oldå
ç´ |
| | | objectsContainer.removeChild(oldSprite); |
| | | } |
| | | |
| | | let sprite = getSprite(item.data, item.y * width, item.x * height, item, (e) => { |
| | | this.rightEvent(item.x, item.y, e); |
| | | updateColor(sprite, 0x9900ff); |
| | | }); |
| | | |
| | | if (item.data == -999) { |
| | | //æ·»å è·¯å¾å
ç´ |
| | | objectsContainer3.addChild(sprite); |
| | | }else { |
| | | //æ·»å å
ç´ |
| | | objectsContainer.addChild(sprite); |
| | | } |
| | | |
| | | //ä¿åæ°å
ç´ |
| | | pixiStageList[item.x][item.y] = sprite |
| | | }); |
| | | } |
| | | |
| | | this.map = map; |
| | | }, |
| | | rightEvent(x, y, e) { |
| | | this.drawerLocNo = true |
| | | this.drawerLocNoData = {x:x, y: y, z: this.currentLev, locNo: this.map[x][y].locNo, |
| | | locSts: this.map[x][y].locSts,row:this.map[x][y].row, bay: this.map[x][y].bay, lev: this.currentLev}; |
| | | }, |
| | | findDiffList(arr1, arr2) { |
| | | let diff = [] |
| | | arr1.forEach((item,index) => { |
| | | item.forEach((val,idx) => { |
| | | if(val.value != arr2[index][idx].value){ |
| | | diff.push({ |
| | | x: index, |
| | | y: idx, |
| | | data: arr2[index][idx].value, |
| | | originData: val.value, |
| | | locSts: val.locSts |
| | | }) |
| | | } |
| | | }) |
| | | }) |
| | | |
| | | return diff; |
| | | }, |
| | | findShuttleDiffList(list1, list2) { |
| | | //æ£æµéå1éé¢çå°è½¦æ¯å¦å¨éå2䏿åå¨ |
| | | if (list1.length == 0) { |
| | | return false;//éå为空 |
| | | } |
| | | if (list1.length != list2.length) { |
| | | return false;//两个éåé¿åº¦ä¸ä¸è´ |
| | | } |
| | | |
| | | let flag = false; |
| | | list1.forEach((item,index) => { |
| | | for (var i = 0; i < list2.length; i++) { |
| | | if (item.shuttleNo == list2[i].shuttleNo) { |
| | | flag = true; |
| | | break; |
| | | } |
| | | } |
| | | }); |
| | | |
| | | return flag; |
| | | }, |
| | | findShuttlePathDiffList(list1, list2) { |
| | | //æ£æµéå1éé¢çå°è½¦é¢è®¡è·¯å¾æ¯å¦å¨éå2䏿åå¨ |
| | | if (list1.length == 0) { |
| | | return false;//éå为空 |
| | | } |
| | | if (list1.length != list2.length) { |
| | | return false;//两个éåé¿åº¦ä¸ä¸è´ |
| | | } |
| | | |
| | | for (var index = 0; index < list1.length; index++) { |
| | | let item = list1[index]; |
| | | for (var i = 0; i < list2.length; i++) { |
| | | if (item.shuttleNo != list2[i].shuttleNo) { |
| | | continue;//æ¾ä¸å°å°è½¦å· |
| | | } |
| | | |
| | | if (item.moveAdvancePath == null) { |
| | | item.moveAdvancePath = []; |
| | | } |
| | | |
| | | if (list2[i].moveAdvancePath == null) { |
| | | list2[i].moveAdvancePath = []; |
| | | } |
| | | |
| | | if (!(item.moveAdvancePath.length == list2[i].moveAdvancePath.length)) { |
| | | return false;//å°è½¦é¢è®¡è·¯å¾é¿åº¦ä¸ä¸è´ |
| | | } |
| | | } |
| | | } |
| | | return true; |
| | | }, |
| | | checkStaInListDiff(sta, list) { |
| | | //æ£æµç«ç¹æ¯å¦å¨éå䏿åå¨ |
| | | if (list.length == 0) { |
| | | return false;//éå为空 |
| | | } |
| | | |
| | | let tmp = null; |
| | | for (var i = 0; i < list.length; i++) { |
| | | if (sta.siteId == list[i].siteId) { |
| | | tmp = list[i];//æ¾å°ç¸åç«ç¹ |
| | | break |
| | | } |
| | | } |
| | | |
| | | if (tmp == null) { |
| | | return false;//æ²¡ææ¾å°ç¸åç«ç¹ |
| | | } |
| | | |
| | | if (sta.siteStatus != tmp.siteStatus) { |
| | | return false;//ç«ç¹ç¶æä¸ç¸å |
| | | } |
| | | |
| | | if (sta.workNo != tmp.workNo) { |
| | | return false;//ç«ç¹å·¥ä½å·ä¸ç¸å |
| | | } |
| | | |
| | | return true;//æ åå |
| | | }, |
| | | webSocketOnOpen(e) { |
| | | console.log("open"); |
| | |
| | | }, |
| | | webSocketOnMessage(e) { |
| | | const result = JSON.parse(e.data); |
| | | if (result.url == "/shuttle/table/shuttle/state") { |
| | | this.setShuttleStateInfo(JSON.parse(result.data)) |
| | | }else if (result.url == "/lift/table/lift/state") { |
| | | this.setLiftStateInfo(JSON.parse(result.data)) |
| | | }else if (result.url == "/console/latest/data/site") { |
| | | this.setSiteInfo(JSON.parse(result.data)) |
| | | }else if (result.url == "/console/map/auth") { |
| | | if (result.url == "/console/map/auth") { |
| | | this.setMap(JSON.parse(result.data)) |
| | | }else if (result.url == "/console/locMap/auth") { |
| | | this.setMap(JSON.parse(result.data)) |
| | | }else if (result.url == "/console/barcode/output/site") { |
| | | this.setCodeData(JSON.parse(result.data)) |
| | | } |
| | | }, |
| | | webSocketClose(e) { |
| | |
| | | sendWs(message) { |
| | | if (ws.readyState == WebSocket.OPEN) { |
| | | ws.send(message) |
| | | } |
| | | }, |
| | | colorRGB(){ |
| | | //éæºé¢è² |
| | | const r = Math.floor(Math.random()*256); |
| | | const g = Math.floor(Math.random()*256); |
| | | const b = Math.floor(Math.random()*256); |
| | | return `rgb(${r},${g},${b})`; |
| | | }, |
| | | updateShuttleXY(item) { |
| | | const shuttle = pixiShuttleMap.get(item.shuttleNo); |
| | | if (shuttle.updateMoveStatus) {//å¨ç»æ§è¡å®ææå¯ç»§ç»æ§è¡å¨ç» |
| | | shuttle.updateMoveStatus = false;//å¨ç»æ§è¡ä¸ |
| | | // 计ç®ä¸¤ç¹ä¹é´çè·ç¦»1 |
| | | const distance = Math.sqrt(Math.pow((item.wcsPoint.x * width) - shuttle.x, 2) + Math.pow((item.wcsPoint.y * height) - shuttle.y, 2)); |
| | | gsap.killTweensOf(shuttle); // ææ»ææé对".class"çå¨ç» |
| | | gsap.to(shuttle, { |
| | | x: (item.wcsPoint.y - 0) * width, // ç®æ ä½ç½® |
| | | y: (item.wcsPoint.x - 1) * height, // ç®æ ä½ç½® |
| | | duration: 0.2, // å¨ç»æç»æ¶é´ï¼ç§ï¼ |
| | | ease: "power1.inOut", // ç¼å¨ç±»å |
| | | onComplete: () => { |
| | | shuttle.updateMoveStatus = true;//å¨ç»æ§è¡å®æ |
| | | } |
| | | }); |
| | | } |
| | | }, |
| | | getSiteInfo() { |
| | | //è·åè¾éç«ç¹æ°æ® |
| | | this.sendWs(JSON.stringify({ |
| | | "url": "/console/latest/data/site", |
| | | "data": {} |
| | | })) |
| | | }, |
| | | setSiteInfo(res) { |
| | | // var test = "{\"msg\":\"æä½æå\",\"code\":200,\"data\":[{\"siteId\":\"300\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"301\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"302\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"303\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"304\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"305\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"306\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"307\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"308\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"309\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"310\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"311\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"312\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"313\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"314\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"315\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"316\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"317\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"318\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"319\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"320\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"321\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"322\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"323\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"324\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"325\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"326\",\"siteStatus\":\"site-auto-id\",\"workNo\":5451},{\"siteId\":\"327\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"200\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"328\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"201\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"329\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"202\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"330\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"203\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"331\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"204\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"332\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"205\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"333\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"334\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"335\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"336\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"337\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"338\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"339\",\"siteStatus\":\"site-auto-run-id\",\"workNo\":5447},{\"siteId\":\"340\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"341\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"342\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"343\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"344\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"345\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"346\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"100\",\"siteStatus\":\"site-auto-run-id\",\"workNo\":8851},{\"siteId\":\"101\",\"siteStatus\":\"site-auto-run-id\",\"workNo\":8855},{\"siteId\":\"102\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"103\",\"siteStatus\":\"site-auto\",\"workNo\":0},{\"siteId\":\"104\",\"siteStatus\":\"site-auto-run\",\"workNo\":0},{\"siteId\":\"105\",\"siteStatus\":\"site-auto\",\"workNo\":0}]}"; |
| | | // res = JSON.parse(test) |
| | | //è·åè¾éç«ç¹æ°æ® |
| | | if (res.code === 200){ |
| | | var sites = res.data; |
| | | if (this.reloadSta && pixiStaMap.size > 0) { |
| | | //éæ°æ¸²æææè¾éç«ç¹ |
| | | this.currentLevStaList = sites; |
| | | this.reloadSta = false; |
| | | sites.forEach((item, index) => { |
| | | let sta = pixiStaMap.get(parseInt(item.siteId)); |
| | | if (sta != undefined) { |
| | | if (item.workNo > 0) { |
| | | sta.textObj.text = item.siteId + "(" + item.workNo + ")"; |
| | | } |
| | | |
| | | //å建é®ç½©å± |
| | | if (item.siteStatus == "site-auto") { |
| | | //èªå¨ç¶æï¼ç§»é¤é®ç½©å± |
| | | if (sta.statusObj != null) { |
| | | objectsContainer.removeChild(sta.statusObj) |
| | | sta.statusObj = null; |
| | | } |
| | | }else if (item.siteStatus == "site-auto-run" || item.siteStatus == "site-auto-run-id") { |
| | | //èªå¨æç© |
| | | let graphics = getGraphics(0xfa51f6, width, height, sta.x, sta.y); |
| | | graphics.addChild(sta.textObj);//ç»§æ¿æåä¿¡æ¯ |
| | | sta.statusObj = graphics; |
| | | objectsContainer.addChild(graphics); |
| | | }else if (item.siteStatus == "site-unauto") { |
| | | //éèªå¨ |
| | | let graphics = getGraphics(0xb8b8b8, width, height, sta.x, sta.y); |
| | | graphics.addChild(sta.textObj);//ç»§æ¿æåä¿¡æ¯ |
| | | sta.statusObj = graphics; |
| | | objectsContainer.addChild(graphics); |
| | | } |
| | | } |
| | | }); |
| | | } else { |
| | | //æ£æµä¸ç¸åç«ç¹è¿è¡å±é¨æ´æ° |
| | | this.currentLevStaList.forEach((item, index) => { |
| | | let result = this.checkStaInListDiff(item, sites); |
| | | if (!result) { |
| | | //éè¦æ´æ° |
| | | let sta = pixiStaMap.get(parseInt(item.siteId)); |
| | | if (item.workNo > 0) { |
| | | sta.textObj.text = item.siteId + "(" + item.workNo + ")"; |
| | | }else { |
| | | sta.textObj.text = item.siteId; |
| | | } |
| | | |
| | | //å建é®ç½©å± |
| | | if (item.siteStatus == "site-auto") { |
| | | //èªå¨ç¶æï¼ç§»é¤é®ç½©å± |
| | | if (sta.statusObj != null) { |
| | | objectsContainer.removeChild(sta.statusObj) |
| | | sta.statusObj = null; |
| | | } |
| | | }else if (item.siteStatus == "site-auto-run") { |
| | | //èªå¨æç© |
| | | let graphics = getGraphics(0xfa51f6, width, height, sta.x, sta.y); |
| | | graphics.addChild(sta.textObj);//ç»§æ¿æåä¿¡æ¯ |
| | | sta.statusObj = graphics; |
| | | objectsContainer.addChild(graphics); |
| | | }else if (item.siteStatus == "site-unauto") { |
| | | //éèªå¨ |
| | | let graphics = getGraphics(0xb8b8b8, width, height, sta.x, sta.y); |
| | | graphics.addChild(sta.textObj);//ç»§æ¿æåä¿¡æ¯ |
| | | sta.statusObj = graphics; |
| | | objectsContainer.addChild(graphics); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | } else if (res.code === 403){ |
| | | parent.location.href = baseUrl+"/login"; |
| | | } else { |
| | | console.log(res.msg); |
| | | } |
| | | }, |
| | | openDrawerSta(data) { |
| | |
| | | } |
| | | } |
| | | }) |
| | | }, |
| | | openDrawerLift(data) { |
| | | this.drawerLift = true; |
| | | this.drawerLiftData = parseInt(data.data) |
| | | }, |
| | | getLiftStateInfo() { |
| | | // æåæºä¿¡æ¯è¡¨è·å |
| | | this.sendWs(JSON.stringify({ |
| | | "url": "/lift/table/lift/state", |
| | | "data": {} |
| | | })) |
| | | }, |
| | | setLiftStateInfo(res) { |
| | | // æåæºä¿¡æ¯è¡¨è·å |
| | | if (res.code == 200) { |
| | | this.liftList = res.data |
| | | } |
| | | }, |
| | | addMoveAdvancePath(moveAdvancePath, shuttleNo) {//æ·»å é¢è®¡è·¯å¾ |
| | | let that = this; |
| | | moveAdvancePath.forEach((path, idx) => { |
| | | let locNo = this.map[path.x, path.y]; |
| | | if (!pixiShuttleMoveAdvancePathMap.has(locNo)) { |
| | | let graphics = getGraphics(0x9966ff, width, height, path.y * width, (path.x - 1) * height); |
| | | let shuttleNos = [shuttleNo]; |
| | | // åå»ºææ¬å¯¹è±¡ |
| | | const style = new PIXI.TextStyle({ |
| | | fontFamily: 'Arial', |
| | | fontSize: 10, |
| | | fill: '#000000', |
| | | }); |
| | | const text = new PIXI.Text(JSON.stringify(shuttleNos), style); |
| | | text.anchor.set(0.5); // è®¾ç½®ææ¬éç¹ä¸ºä¸å¿ç¹ |
| | | text.position.set(graphics.width / 2, graphics.height / 2); // å°ææ¬ä½ç½®è®¾ç½®ä¸ºGraphics对象çä¸å¿ç¹ |
| | | // å°ææ¬å¯¹è±¡æ·»å å°Graphicså¯¹è±¡ä¸ |
| | | graphics.addChild(text); |
| | | graphics.textObj = text; |
| | | objectsContainer2.addChild(graphics) |
| | | pixiShuttleMoveAdvancePathMap.set(locNo, { |
| | | path: path, |
| | | sprite: graphics, |
| | | textObj: text, |
| | | shuttleNos: shuttleNos |
| | | }) |
| | | |
| | | if (pixiShuttleMoveAdvancePathList[shuttleNo] == null) { |
| | | let locNos = new Set() |
| | | locNos.add(locNo); |
| | | pixiShuttleMoveAdvancePathList[shuttleNo] = locNos; |
| | | }else { |
| | | pixiShuttleMoveAdvancePathList[shuttleNo].add(locNo); |
| | | } |
| | | }else { |
| | | let pathMap = pixiShuttleMoveAdvancePathMap.get(locNo) |
| | | let shuttleNos = pathMap.shuttleNos; |
| | | shuttleNos.push(shuttleNo); |
| | | pathMap.textObj.text = JSON.stringify(shuttleNos); |
| | | pixiShuttleMoveAdvancePathMap.set(locNo, pathMap); |
| | | if (pixiShuttleMoveAdvancePathList[shuttleNo] == null) { |
| | | let locNos = new Set() |
| | | locNos.add(locNo); |
| | | pixiShuttleMoveAdvancePathList[shuttleNo] = locNos; |
| | | }else { |
| | | pixiShuttleMoveAdvancePathList[shuttleNo].add(locNo); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | removeMoveAdvancePath(shuttleNo) {//å é¤é¢è®¡è·¯å¾ |
| | | let locNos = pixiShuttleMoveAdvancePathList[shuttleNo]; |
| | | if (locNos != null) { |
| | | locNos.forEach((locNo,index) => { |
| | | let pathMap = pixiShuttleMoveAdvancePathMap.get(locNo); |
| | | if (pathMap != null) { |
| | | let shuttleNos = pathMap.shuttleNos; |
| | | let shuttleNosNew = []; |
| | | shuttleNos.forEach((shuttle, idx) => { |
| | | if (shuttle != shuttleNo) { |
| | | shuttleNosNew.push(shuttle); |
| | | } |
| | | }); |
| | | |
| | | if (shuttleNosNew.length === 0) { |
| | | //é¢è®¡è·¯å¾æ²¡æå°è½¦ï¼ç´æ¥å é¤è·¯å¾ |
| | | objectsContainer2.removeChild(pathMap.sprite); |
| | | pixiShuttleMoveAdvancePathMap.delete(locNo) |
| | | }else { |
| | | //é¢è®¡è·¯å¾åå¨å
¶ä»å°è½¦ï¼æ´æ°æåä¿¡æ¯ |
| | | pathMap.textObj.text = JSON.stringify(shuttleNosNew); |
| | | pathMap.shuttleNos = shuttleNosNew; |
| | | pixiShuttleMoveAdvancePathMap.set(locNo, pathMap); |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | }, |
| | | } |
| | | }) |