| | |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && isInEnable(devpThread, inSta.getStaNo()) && !staProtocol.isEmptyMk() && (workNo == 0 || (workNo >= 9990 && workNo <= 9999)) && staProtocol.isPakMk()) { |
| | | String barcode = staProtocol.getBarcode(); |
| | | // 判断重复工作档 |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_sta_no", inSta.getStaNo()).eq("wrk_sts", WrkStsType.NEW_INBOUND.sts).eq("barcode", barcode)); |
| | | if (wrkMast != null) { |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_sta_no", inSta.getStaNo()).eq("barcode", barcode)); |
| | | if (wrkMast != null && wrkMast.getWrkSts() == WrkStsType.NEW_INBOUND.sts) { |
| | | News.error("工作档已存在,工作号={}", wrkMast.getWrkNo()); |
| | | //判断时提升机侧,还是无提升机测 |
| | | staProtocol.setWorkNo(Short.parseShort(String.valueOf(wrkMast.getWrkNo()))); |
| | |
| | | wrkMast.setWrkSts(WrkStsType.INBOUND_DEVICE_RUN.sts); |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | } else if (wrkMast != null && wrkMast.getWrkSts() != WrkStsType.NEW_INBOUND.sts) { |
| | | continue; |
| | | } |
| | | try { |
| | | String wmsUrl = "192.168.10.201:8080/fyxcwms"; |
| | |
| | | param.setBarcode(barcode); |
| | | param.setIoType(1); |
| | | param.setSourceStaNo(inSta.getStaNo()); |
| | | param.setLocType1(staProtocol.getLocType1().shortValue()); |
| | | param.setLocType1((short) 1); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/pakin/loc/v1") |
| | |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() && isInEnable(devpThread, inSta.getStaNo()) && !staProtocol.isEmptyMk() && (workNo == 0 || (workNo >= 9990 && workNo <= 9999)) && staProtocol.isPakMk()) { |
| | | String barcode = staProtocol.getBarcode(); |
| | | // 判断重复工作档 |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_sta_no", inSta.getStaNo()).eq("wrk_sts", WrkStsType.NEW_INBOUND.sts).eq("barcode", barcode)); |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_sta_no", inSta.getStaNo()).eq("barcode", barcode)); |
| | | if (wrkMast == null) { |
| | | try { |
| | | String wmsUrl = "192.168.10.201:8080/fyxcwms"; |
| | |
| | | News.info("{}任务,{}站点,托盘码不匹配,站点托盘码:{},任务托盘码:{}", wrkMast.getWrkNo(), staProtocol.getSiteId(), staProtocol.getBarcode(), wrkMast.getBarcode()); |
| | | return false; |
| | | } |
| | | } else { |
| | | } else if (sourceStaNo == 1012) { |
| | | if (staProtocol.getWorkNo().intValue() != wrkMast.getWrkNo()) { |
| | | News.info("{}任务,{}站点,任务号不一致", wrkMast.getWrkNo(), staProtocol.getSiteId()); |
| | | return false; |
| | | } |
| | | if (!staProtocol.getBarcode().equals(wrkMast.getBarcode())) { |
| | | News.info("{}任务,{}站点,托盘码不匹配,站点托盘码:{},任务托盘码:{}", wrkMast.getWrkNo(), staProtocol.getSiteId(), staProtocol.getBarcode(), wrkMast.getBarcode()); |
| | | return false; |
| | | } |
| | | } else if (sourceStaNo == 1032 || sourceStaNo == 1031) { |
| | | if (staProtocol.getWorkNo().intValue() != wrkMast.getWrkNo()) { |
| | | News.info("{}任务,{}站点,任务号不一致", wrkMast.getWrkNo(), staProtocol.getSiteId()); |
| | | return false; |
| | |
| | | } |
| | | |
| | | private void shuttleMoveExecuteTransportNoLift(WrkMast wrkMast) { |
| | | if (12 == Utils.getRow(wrkMast.getSourceLocNo()) && 3 == Utils.getBay(wrkMast.getSourceLocNo())) { |
| | | WrkMast mainWrk = wrkMastService.selectByWorkNo(wrkMast.getMainWrkNo()); |
| | | if (mainWrk != null && mainWrk.getIoType() == 1) { |
| | | //入库 |
| | | noLiftInService.shuttleMoveExecute(wrkMast); |
| | | } else { |
| | | noLiftInService.shuttleMoveExecute(wrkMast, mainWrk.getStaNo()); |
| | | } else if (mainWrk != null && mainWrk.getIoType() == 101) { |
| | | //出库 |
| | | noLiftOutService.shuttleMoveExecute(wrkMast); |
| | | } |
| | |
| | | * 从没有提升机侧入库,有两种情况,一种入库到同层,一种入库到不同层,则需要提升机 |
| | | * @param wrkMast |
| | | */ |
| | | public void shuttleMoveExecute(WrkMast wrkMast) { |
| | | public void shuttleMoveExecute(WrkMast wrkMast, Integer staNo) { |
| | | boolean stepMoveSta = this.shuttleMoveExecuteTransportLiftStepCallShuttle(wrkMast);//小车迁移-呼叫小车至取货点 |
| | | if (!stepMoveSta) { |
| | | return; |
| | | } |
| | | //判断目标库位是否在1层或5层 |
| | | if (Utils.getLev(wrkMast.getLocNo()) == 1 || Utils.getLev(wrkMast.getLocNo()) == 5) { |
| | | if ((Utils.getLev(wrkMast.getSourceLocNo()) == 1 && staNo == 1015) || (Utils.getLev(wrkMast.getSourceLocNo()) == 5 && staNo == 1026)) { |
| | | //直接入库 |
| | | boolean stepMoveLoc = this.shuttleMoveExecuteStepMoveLoc(wrkMast);//小车移动到目标库位中 |
| | | if (!stepMoveLoc) { |
| | |
| | | if (devpThread == null) { |
| | | return false; |
| | | } |
| | | StaProtocol staProtocol = devpThread.getStation().get(Utils.getLev(wrkMast.getSourceLocNo()) == 1 ? 1015 : 1026); |
| | | if (!staProtocol.isLoading() || !staProtocol.isAutoing()) { |
| | | log.info("{}任务,{}号输送线无物", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线无物", wrkMast.getWrkNo(), wrkMast.getSourceLocNo()); |
| | | return false; |
| | | } |
| | | WrkMast wrkMast1 = wrkMastService.selectByWorkNo(wrkMast.getMainWrkNo()); |
| | | if (wrkMast1 != null) { |
| | | StaProtocol staProtocol = devpThread.getStation().get(wrkMast1.getStaNo()); |
| | | if (!staProtocol.isLoading() || !staProtocol.isAutoing()) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线无物或非自动", wrkMast.getWrkNo(), wrkMast.getSourceLocNo()); |
| | | return false; |
| | | } |
| | | |
| | | if (!staProtocol.getFinishWorkNo().equals(wrkMast.getWrkNo())) { |
| | | log.info( "{}任务,{}号输送线的工作号和工作档不匹配", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线的工作号和工作档不匹配", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | return false; |
| | | if (staProtocol.getFinishWorkNo() != null && staProtocol.getFinishWorkNo().intValue() != wrkMast.getMainWrkNo()) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线的工作号和工作档不匹配", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | return false; |
| | | } |
| | | } |
| | | //小车处于空闲状态 |
| | | if (!shuttleThread.isIdle()) { |
| | |
| | | } |
| | | |
| | | //判断提升机是否有其他任务(该任务需要换层必须提前独占提升机) |
| | | WrkMast liftWrkMast = wrkMastService.selectLiftWrkMastAndWrkNo(liftProtocol.getLiftNo(),wrkMast.getWrkNo(),wrkMast.getMainWrkNo()); |
| | | WrkMast liftWrkMast = wrkMastService.selectLiftWrkMastAndWrkNo(liftProtocol.getLiftNo(), wrkMast.getWrkNo(), wrkMast.getMainWrkNo()); |
| | | if (liftWrkMast != null) { |
| | | if (liftWrkMast != null && !wrkMast.getMainWrkNo().equals(liftWrkMast.getWrkNo())) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), liftProtocol.getLiftNo()); |
| | |
| | | } |
| | | |
| | | //判断提升机是否有其他任务 |
| | | WrkMast liftWrkMast = wrkMastService.selectLiftWrkMastAndWrkNo(liftProtocol.getLiftNo(),wrkMast.getWrkNo(),wrkMast.getMainWrkNo()); |
| | | WrkMast liftWrkMast = wrkMastService.selectLiftWrkMastAndWrkNo(liftProtocol.getLiftNo(), wrkMast.getWrkNo(), wrkMast.getMainWrkNo()); |
| | | if (liftWrkMast != null) { |
| | | if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//提升机任务和当前任务不相同 |
| | | News.info("{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo()); |
| | |
| | | } |
| | | |
| | | //判断提升机是否有其他任务 |
| | | WrkMast liftWrkMast = wrkMastService.selectLiftWrkMastAndWrkNo(liftProtocol.getLiftNo(),wrkMast.getWrkNo(),wrkMast.getMainWrkNo()); |
| | | WrkMast liftWrkMast = wrkMastService.selectLiftWrkMastAndWrkNo(liftProtocol.getLiftNo(), wrkMast.getWrkNo(), wrkMast.getMainWrkNo()); |
| | | if (liftWrkMast != null) { |
| | | if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//提升机任务和当前任务不相同 |
| | | News.info("{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo()); |
| | |
| | | } |
| | | |
| | | //判断提升机是否有其他任务 |
| | | WrkMast liftWrkMast = wrkMastService.selectLiftWrkMastAndWrkNo(liftProtocol.getLiftNo(),wrkMast.getWrkNo(),wrkMast.getMainWrkNo()); |
| | | WrkMast liftWrkMast = wrkMastService.selectLiftWrkMastAndWrkNo(liftProtocol.getLiftNo(), wrkMast.getWrkNo(), wrkMast.getMainWrkNo()); |
| | | if (liftWrkMast != null) { |
| | | if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//提升机任务和当前任务不相同 |
| | | News.info("{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo()); |
| | |
| | | } |
| | | |
| | | //判断提升机是否有其他任务 |
| | | WrkMast liftWrkMast = wrkMastService.selectLiftWrkMastAndWrkNo(1,wrkMast.getWrkNo(),wrkMast.getMainWrkNo()); |
| | | WrkMast liftWrkMast = wrkMastService.selectLiftWrkMastAndWrkNo(1, wrkMast.getWrkNo(), wrkMast.getMainWrkNo()); |
| | | if (liftWrkMast != null) { |
| | | if (!liftWrkMast.getWrkNo().equals(wrkMast.getWrkNo())) {//提升机任务和当前任务不相同 |
| | | News.info("{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), wrkMast.getLiftNo()); |
| | |
| | | } |
| | | StaProtocol staProtocol = devpThread.getStation().get(Utils.getLev(wrkMast.getSourceLocNo()) == 1 ? 1015 : 1026); |
| | | if (!staProtocol.isLoading()) { |
| | | log.error("{}任务,{}号输送线无物", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线无物", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | //log.error("{}任务,{}号输送线无物", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线无物或非自动", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | return false; |
| | | } |
| | | if (!staProtocol.getFinishWorkNo().equals(wrkMast.getWrkNo())) { |
| | | log.error("{}任务,{}号输送线的工作号和工作档不匹配", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | if (staProtocol.getFinishWorkNo() != null && staProtocol.getFinishWorkNo().intValue() != wrkMast.getMainWrkNo()) { |
| | | //log.error("{}任务,{}号输送线的工作号和工作档不匹配", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线的工作号和工作档不匹配", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | return false; |
| | | } |
| | |
| | | if (devpThread == null) { |
| | | return false; |
| | | } |
| | | int lev = Utils.getLev(wrkMast.getLocNo()); |
| | | StaProtocol staProtocol2 = devpThread.getStation().get(lev == 1 ? 1014 : 1025); |
| | | |
| | | if (!staProtocol2.isOutEnable()) { |
| | | log.error("{}任务,{}号输送线不可出", wrkMast.getWrkNo(), lev == 1 ? 1014 : 1025); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线不可出", wrkMast.getWrkNo(), lev == 1 ? 1014 : 1025); |
| | | return false; |
| | | } |
| | | |
| | | StaProtocol staProtocol = devpThread.getStation().get(lev == 1 ? 1015 : 1026); |
| | | if (staProtocol.isLoading()) { |
| | | log.error("{}任务,{}号输送线有物", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线有物", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | return false; |
| | | WrkMast wrkMast1 = wrkMastService.selectByWorkNo(wrkMast.getMainWrkNo()); |
| | | if (wrkMast1 != null) { |
| | | StaProtocol staProtocol2 = devpThread.getStation().get(wrkMast1.getStaNo()); |
| | | if (!staProtocol2.isOutEnable()) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线不可出111", wrkMast.getWrkNo(), wrkMast1.getStaNo()); |
| | | return false; |
| | | } |
| | | StaProtocol staProtocol = devpThread.getStation().get(wrkMast1.getStaNo() + 1); |
| | | if (staProtocol.isLoading()) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线有物111", wrkMast.getWrkNo(), wrkMast1.getStaNo() + 1); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | if (shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) { |
| | |
| | | if (devpThread == null) { |
| | | return false; |
| | | } |
| | | int lev = Utils.getLev(wrkMast.getLocNo()); |
| | | StaProtocol staProtocol2 = devpThread.getStation().get(lev == 1 ? 1014 : 1025); |
| | | |
| | | if (!staProtocol2.isOutEnable()) { |
| | | log.error("{}任务,{}号输送线不可出", wrkMast.getWrkNo(), lev == 1 ? 1014 : 1025); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线不可出", wrkMast.getWrkNo(), lev == 1 ? 1014 : 1025); |
| | | return false; |
| | | } |
| | | StaProtocol staProtocol = devpThread.getStation().get(lev == 1 ? 1015 : 1026); |
| | | if (staProtocol.isLoading()) { |
| | | log.error("{}任务,{}号输送线有物", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线有物", wrkMast.getWrkNo(), wrkMast.getSourceStaNo()); |
| | | return false; |
| | | WrkMast wrkMast1 = wrkMastService.selectByWorkNo(wrkMast.getMainWrkNo()); |
| | | if (wrkMast1 != null) { |
| | | StaProtocol staProtocol2 = devpThread.getStation().get(wrkMast1.getStaNo()); |
| | | if (!staProtocol2.isOutEnable()) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线不可出222", wrkMast.getWrkNo(), wrkMast1.getStaNo()); |
| | | return false; |
| | | } |
| | | StaProtocol staProtocol = devpThread.getStation().get(wrkMast1.getStaNo() + 1); |
| | | if (staProtocol.isLoading()) { |
| | | News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号输送线有物222", wrkMast.getWrkNo(), wrkMast1.getStaNo()); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | if (shuttleProtocol.getCurrentLocNo().equals(wrkMast.getSourceLocNo())) { |
| | |
| | | main.setShuttleNo(wrkMast.getShuttleNo()); |
| | | main.setWrkSts(WrkStsType.OUTBOUND_SHUTTLE_RUN_COMPLETE.sts); |
| | | //那时候托盘在提升机里,则需要锁住 |
| | | main.setShuttleNo(1); |
| | | if (!(main.getStaNo() != 1013 && main.getStaNo() != 1024)) { |
| | | main.setLiftNo(1); |
| | | } |
| | | } |
| | | main.setModiTime(new Date()); |
| | | if (!wrkMastService.updateById(main)) { |
| | |
| | | |
| | | import java.io.BufferedReader; |
| | | import java.io.InputStreamReader; |
| | | import java.util.*; |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * A*算法使用工具 |
| | |
| | | } |
| | | |
| | | //判断当前节点到下一个节点是否为拐点 |
| | | public HashMap<String,Object> searchInflectionPoint(NavigateNode currentNode, NavigateNode fatherNode, NavigateNode nextNode) { |
| | | public HashMap<String, Object> searchInflectionPoint(NavigateNode currentNode, NavigateNode fatherNode, NavigateNode nextNode) { |
| | | HashMap<String, Object> map = new HashMap<>(); |
| | | map.put("result", false);//是否为拐点,true:拐点,false:直线 |
| | | // 第一个点或直线点 |
| | |
| | | if (currentNode.getX() - fatherNode.getX() > 0) { |
| | | //大于0,方向top |
| | | direction = "top"; |
| | | }else { |
| | | } else { |
| | | //小于0,方向bottom |
| | | direction = "bottom"; |
| | | } |
| | |
| | | if (currentNode.getY() - fatherNode.getY() > 0) { |
| | | //大于0,方向left |
| | | direction = "left"; |
| | | }else { |
| | | } else { |
| | | //小于0,方向right |
| | | direction = "right"; |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | News.info("{}目标库位没有搜索到可用穿梭车", locNo); |
| | | //News.info("{}目标库位没有搜索到可用穿梭车", locNo); |
| | | return false; |
| | | } |
| | | |
| | |
| | | int currentLev = Utils.getLev(shuttleProtocol.getCurrentLocNo());//小车当前层高 |
| | | String currentLocNo = shuttleProtocol.getCurrentLocNo();//小车当前库位号 |
| | | |
| | | if (currentLocNo.equals(locNo)) { |
| | | if (currentLocNo.equals(locNo) || currentLocNo.equals(sourceLocNo)) { |
| | | //车辆当前位置已经是目标库位,调度该车 |
| | | //给工作档绑定小车号 |
| | | WrkMast wrkMast1 = wrkMastService.selectByWorkNo(wrkNo); |
| | |
| | | sameShuttles.put(-1, shuttleThread); |
| | | continue; |
| | | } |
| | | |
| | | //当前穿梭车线程到目标地点距离 |
| | | List<NavigateNode> currentShuttlePath = navigateUtils.calc(currentLocNo, locNo, NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleNo, Utils.getLev(currentLocNo)), null);//搜索空闲穿梭车,使用正常通道地图 |
| | | if (currentShuttlePath == null) { |
| | | continue; |
| | | //TODO |
| | | List<NavigateNode> currentShuttlePath; |
| | | if (Utils.getLev(currentLocNo) != Utils.getLev(locNo)) { |
| | | //当前穿梭车线程到目标地点距离 |
| | | currentShuttlePath = navigateUtils.calc(currentLocNo, sourceLocNo, NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleNo, Utils.getLev(currentLocNo)), null);//搜索空闲穿梭车,使用正常通道地图 |
| | | if (currentShuttlePath == null) { |
| | | continue; |
| | | } |
| | | } else { |
| | | //当前穿梭车线程到目标地点距离 |
| | | currentShuttlePath = navigateUtils.calc(currentLocNo, locNo, NavigationMapType.NORMAL.id, Utils.getShuttlePoints(shuttleNo, Utils.getLev(currentLocNo)), null);//搜索空闲穿梭车,使用正常通道地图 |
| | | if (currentShuttlePath == null) { |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | Integer currentAllDistance = navigateUtils.getOriginPathAllDistance(currentShuttlePath);//计算当前路径行走总距离 |
| | | sameShuttles.put(currentAllDistance, shuttleThread); |
| | | } |
| | |
| | | return false; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 小车迁移任务生成 |
| | | */ |