package com.zy.asrs.utils; import java.util.ArrayList; import java.util.List; import static java.util.stream.Collectors.toList; import com.zy.asrs.entity.WrkMastSta; import com.zy.core.enums.RouteCollectCountType; import springfox.documentation.spring.web.json.Json; /** * Created by Monkey D. Luffy on 2023/7/18 */ public class RouteUtils { public static final List MERGE_STA_NO_One = new ArrayList() {{ // add(116);add(117); add(104);add(122); }}; public static final List MERGE_STA_NO_TWO = new ArrayList() {{ // add(113);add(123);add(114);add(1142); add(107);add(118); }}; public static final List MERGE_STA_NO_THREE = new ArrayList() {{ // add(107);add(118);add(108);add(119); add(108);add(119); }}; public static final List MERGE_STA_NO_FOUR = new ArrayList() {{ // add(110);add(120);add(111);add(121); add(110);add(120); }}; public static final List MERGE_STA_NO_FIVE = new ArrayList() {{ // add(104);add(122);add(105); add(111);add(121); }}; public static final List MERGE_STA_NO_SIX = new ArrayList() {{ // add(108);add(119);add(110);add(120); add(113);add(123);add(114); }}; public static final List MERGE_STA_NO_SEVEN = new ArrayList() {{ }}; public static final List MERGE_STA_NO_EIGHT = new ArrayList() {{ }}; public static final List MERGE_STA_NO_NINE = new ArrayList() {{ }}; // 正序 public static final List TRACK_POSITION_POSITIVE_SEQUENCE = new ArrayList() {{ add(101);add(102);add(104);add(122);add(105);add(107);add(118);add(108);add(119);add(110);add(120);add(111);add(121);add(113);add(123);add(114);add(1142);add(116);add(117); }}; // 反序 public static final List TRACK_POSITION_REVERSE_SEQUENCE = new ArrayList() {{ add(117);add(116);add(1142);add(114);add(123);add(113);add(121);add(111);add(120);add(110);add(119);add(108);add(118);add(107);add(105);add(122);add(104);add(102);add(101); }}; public static String zerofill(String msg, Integer count){ if (msg.length() == count){ return msg; } else if (msg.length() > count){ return msg.substring(0, 16); } else { StringBuilder msgBuilder = new StringBuilder(msg); for (int i = 0; i staFall = new ArrayList<>(); if (MERGE_STA_NO_SIX.contains(staNo)){ // staFall = MERGE_STA_NO_SIX; if (rgvNo==1){ if (staNo==113){ return 123; } else { return 114; } }else { if (staNo==114){ return 123; } else { return 113; } } }else if (MERGE_STA_NO_One.contains(staNo)){ staFall = MERGE_STA_NO_One; }else if (MERGE_STA_NO_TWO.contains(staNo)){ staFall = MERGE_STA_NO_TWO; }else if (MERGE_STA_NO_THREE.contains(staNo)){ staFall = MERGE_STA_NO_THREE; }else if (MERGE_STA_NO_FOUR.contains(staNo)){ staFall = MERGE_STA_NO_FOUR; }else if (MERGE_STA_NO_FIVE.contains(staNo)){ staFall = MERGE_STA_NO_FIVE; }else { return staNo; } int indexNo = 0; if (rgvNo==1){ indexNo=staFall.size()-1; } return staFall.get(indexNo); } public static Integer RouteIndexFarMasOtherNear(int rgvNo,Integer staNo){ if (rgvNo==1){ switch (staNo){ case 117: return 116; case 116: return 1142; case 1142: case 114: return 114; case 123: return 113; case 113: return 121; case 121: return 111; case 111: return 110; case 120: case 110: return 119; case 119: case 108: return 118; case 118: case 107: return 105; case 105: case 122: return 122; case 104: return 104; case 102: return 102; case 101: return 101; default: return 102; } }else { switch (staNo){ case 117: return 117; case 116: return 116; case 1142: return 116; case 114: return 116; case 123: return 1142; case 113: return 114; case 121: return 113; case 111: return 113; case 120: return 121; case 110: return 111; case 119: return 110; case 108: return 110; case 118: return 119; case 107: return 107; case 105: return 107; case 122: return 122; case 104: return 104; case 102: return 104; case 101: return 102; default: return 116; } } } public static Integer RouteIndexFarMasOtherNearUpMap(int rgvNo,Integer staNo){ // int ia = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(staNo); // int ib = TRACK_POSITION_REVERSE_SEQUENCE.indexOf(staNo); // if (ia<=ib){ // return new Integer[]{RouteIndexFarMasReverse(1,runStaStart),RouteIndexFarMasReverse(2,runStaEnd)}; // }else { // return new Integer[]{RouteIndexFarMasReverse(1,runStaEnd),RouteIndexFarMasReverse(2,runStaStart)}; // } // if (ia<=ib){ // return new Integer[]{TRACK_POSITION_POSITIVE_SEQUENCE.get(ia),TRACK_POSITION_POSITIVE_SEQUENCE.get(ib)}; // }else { // return new Integer[]{TRACK_POSITION_POSITIVE_SEQUENCE.get(ib),TRACK_POSITION_POSITIVE_SEQUENCE.get(ia)}; // } // if (rgvNo==1){ // if (ia-2>=1){ // return TRACK_POSITION_POSITIVE_SEQUENCE.get(ia-2); // }else { // return 102; // } return RouteIndexFarMasOther(rgvNo,staNo); // }else { // if (ib-2>=1){ // return TRACK_POSITION_REVERSE_SEQUENCE.get(ib-2); // }else { // return 116; // } // } } // /* * 获取干涉最远站点 * */ public static Integer RouteIndexFarMasOther(int rgvNo,Integer staNo){ if (rgvNo==1){ switch (staNo){ case 101: return 102; case 102: return 122; case 104: case 122: case 105: return 105; case 107: case 118: return 119; case 108: case 119: return 120; case 110: case 120: case 111: return 121; case 121: return 113; case 113: return 1142; case 123: case 114: return 116; default: return 116; } }else { switch (staNo){ case 117: case 116: return 1142; case 1142: case 114: case 123: return 113; case 113: return 121; case 121: case 111: return 110; case 120: case 110: return 108; case 119: case 108: case 118: case 107: return 107; case 105: return 104; case 122: case 104: return 102; default: return 102; } } // if (rgvNo==1){ // switch (staNo){ // case 101: // case 102: return 102; // case 104: // case 122: return 118; // case 105: return 119; // case 107: // case 118: return 120; // case 108: // case 119: return 111; // case 110: // case 120: return 113; // case 111: // case 121: return 113; // case 113: return 114; // case 123: // case 114: return 1142; // default: // return 116; // } // }else { // switch (staNo){ // case 117: // case 116: return 123; // case 1142: // case 114: return 113; // case 123: // case 113: return 111; // case 121: // case 111: return 108; // case 120: // case 110: return 107; // case 119: // case 108: return 107; // case 118: // case 107: return 105; // case 105: // case 122: // case 104: return 104; // default: // return 102; // } // } } /* * 获取干涉最远站点 * */ public static Integer RouteIndexFarMasReverse(int rgvNo,Integer staNo){ if (rgvNo==1) { switch (staNo) { case 101: case 102: return 102; case 104: case 122: case 105: return 102; case 107: case 118: case 108: case 119: return 105; case 110: case 120: return 107; case 111: case 121: return 108; case 113: return 111; case 123: case 114: return 121; case 1142: case 116: case 117: return 102; default: return 101; } }else{ switch (staNo) { case 117: case 116: case 1142: return 116; case 114: case 123: case 113: return 117; case 121:return 123; case 111: case 120: case 110: return 113; case 119: case 108: return 111; case 118: case 107: return 110; case 105: case 122: case 104: return 107; case 102: case 101: return 116; default: return 117; } /* * switch (staNo){ case 117: case 116: return 1142; case 1142: case 114: case 123: return 113; case 113: return 121; case 121: case 111: return 110; case 120: case 110: return 108; case 119: case 108: case 118: case 107: return 107; case 105: return 104; case 122: case 104: return 102; default: return 102; }*/ } } // 获取当前小车未行走的路线集合 public static List getRoute(Integer groupStart,Integer groupEnd){ boolean sign = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(groupStart) < TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(groupEnd); List result = new ArrayList<>(); List groupRoute = new ArrayList<>(); if (sign){ groupRoute = TRACK_POSITION_POSITIVE_SEQUENCE; }else { groupRoute = TRACK_POSITION_REVERSE_SEQUENCE; } if (groupRoute.contains(groupStart) && groupRoute.contains(groupEnd)) { sign = false; for (Integer route : groupRoute) { if (route.equals(groupStart)){ sign=true; } if (route.equals(groupEnd)){ result.add(route); break; } if (sign){ result.add(route); } } }else { return null; } return result; } /* * 获取最远站点 * */ public static Integer RouteIndexFarMas(Integer a,Integer b,Integer c,Integer d){ int ia = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(a); int ib = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(b); int ic = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(c); int id = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(d); if (id == 0){ if (ib>ic){ return b; }else { return c; } }else { if (ibib){ // if (ia>ic){ // return a; // }else { // return c; // } // }else { // if (ib>ic){ // return b; // }else { // return c; // } // } // }else { // if (iaib){ if (ia>ic){ return a; }else { return c; } }else { if (ib>ic){ return b; }else { return c; } } }else { if (ia RouteMapCurrentFar(Integer a,Integer b,Integer c,Integer d){ Integer farStn = RouteIndexFarMas(a, b, c, d); return getRouteIntersection(TRACK_POSITION_POSITIVE_SEQUENCE,getRoute(farStn, d), RouteCollectCountType.DIFFERENCESET); } public static List RouteMapCurrentFar(Integer farStn,Integer d){ return getRouteIntersection(TRACK_POSITION_POSITIVE_SEQUENCE,getRoute(farStn, d), RouteCollectCountType.DIFFERENCESET); } /* * 另一台小车最远位置 * */ public static Integer RouteMapOtherFarStnNo(List routeDIFF,Integer d){ int id = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(d); if (id==0){ return routeDIFF.get(0); }else { int size = routeDIFF.size(); return routeDIFF.get(size-1); } } //是否有交集 public static boolean getRouteBoolean(List groupCurrent,List groupOther){ for (Integer positionCurrent : groupCurrent){ for (Integer positionOther : groupOther){ if (positionCurrent.equals(positionOther)){ return true; } } } return false; } //集合运算 public static List getRouteIntersection(List groupCurrent, List groupOther, RouteCollectCountType routeCollectCountType){ switch (routeCollectCountType){ case INTERSECTION: //交集 return groupCurrent.stream().filter(item -> groupOther.contains(item)).collect(toList()); case DIFFERENCESET: //差集 return groupCurrent.stream().filter(item -> !groupOther.contains(item)).collect(toList()); case UNION: //并集 groupCurrent.addAll(groupOther); return groupCurrent; case DEDUPLICATIONUNION: //去重并集 groupCurrent.addAll(groupOther); return groupCurrent.stream().distinct().collect(toList()); default: return null; } } /* * a 小车当前位置 * b 小车任务开始位置 * c 小车任务结束位置 * sign 另一个小车空闲标记 * */ public static boolean RouteAutoBoolean(Integer a,Integer b,Integer c,Integer aa,Integer bb,Integer cc,boolean idleOther){ List routeCurrent = getRouteIntersection(getRoute(a, c), getRoute(b, c), RouteCollectCountType.DEDUPLICATIONUNION);//并集 List routeOther = getRouteIntersection(getRoute(aa, cc), getRoute(bb, cc), RouteCollectCountType.DEDUPLICATIONUNION);// return !getRouteBoolean(routeCurrent, routeOther); //是否有交集 } public static List RouteAutoBoolean(Integer a,Integer b,Integer c){ return getRouteIntersection(getRoute(a, c), getRoute(b, c), RouteCollectCountType.DEDUPLICATIONUNION); } public static Integer[] RgvRunSta(Integer runStaStart,Integer runStaEnd){ int ia = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(runStaStart); int ib = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(runStaEnd); if (ia<=ib){ return new Integer[]{RouteIndexFarMasReverse(1,runStaStart),RouteIndexFarMasReverse(2,runStaEnd)}; }else { return new Integer[]{RouteIndexFarMasReverse(1,runStaEnd),RouteIndexFarMasReverse(2,runStaStart)}; } // if (ia<=ib){ // return new Integer[]{TRACK_POSITION_POSITIVE_SEQUENCE.get(ia),TRACK_POSITION_POSITIVE_SEQUENCE.get(ib)}; // }else { // return new Integer[]{TRACK_POSITION_POSITIVE_SEQUENCE.get(ib),TRACK_POSITION_POSITIVE_SEQUENCE.get(ia)}; // } // if (ia<=ib){ // return new Integer[]{TRACK_POSITION_POSITIVE_SEQUENCE.get(ia-1),TRACK_POSITION_POSITIVE_SEQUENCE.get(ib+1)}; // }else { // return new Integer[]{TRACK_POSITION_POSITIVE_SEQUENCE.get(ib+1),TRACK_POSITION_POSITIVE_SEQUENCE.get(ia-1)}; // } } public static boolean RgvRunStaSign(Integer staBow,Integer runStaEnd,Integer rgvNo){ int ia = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(staBow); int ib = TRACK_POSITION_POSITIVE_SEQUENCE.indexOf(runStaEnd); if (rgvNo==1){ if (ia>ib){ return true;//需要避让 }else { return false;//不需要避让 } }else { if (ia routeCurrent = getRoute(104, 119); //获取当前小车路径 List routeOther = getRoute(117, 118); //获取其它小车路径 System.out.println("当前小车路径:\t"+routeCurrent); System.out.println("其它小车路径:\t"+routeOther); boolean routeBoolean = getRouteBoolean(routeCurrent, routeOther); //是否有交集 System.out.println("是否有交集:\t"+routeBoolean); List routeIntersection = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.INTERSECTION);//交集 System.out.println("路径交集:\t"+routeIntersection); List routeIntersection1 = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.DIFFERENCESET);//差集 System.out.println("路径差集:\t"+routeIntersection1); List routeIntersection2 = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.UNION);//并集 System.out.println("路径并集:\t"+routeIntersection2); List routeIntersection3 = getRouteIntersection(routeCurrent, routeOther, RouteCollectCountType.DEDUPLICATIONUNION);//去重并集 System.out.println("路径去重并集:\t"+routeIntersection3); System.out.println(RouteAutoBoolean(101,104,119,114,116,120,true)); List routeDIFF = RouteMapCurrentFar(114, 104, 119, 117); System.out.println("当前路径最大集合:\t"+ routeDIFF); Integer routeFarOther= RouteMapOtherFarStnNo(routeDIFF,117); System.out.println("另一台小车最远站点:\t"+routeFarOther); Integer[] integers = RouteIndexFarArr(114, 104, 119, 101); for (Integer integer:integers){ System.out.println(integer); } } public static short RgvPosSta(Integer rgvId,Short posId){ switch (rgvId){ case 1: return RgvPosStaOne(posId); case 2: return RgvPosStaTwo(posId); default: return 1; } } public static short RgvPosStaOne(Short posId){ switch (posId.intValue()){ case 1: case 2: return 102; case 3: case 4: return 122; case 5: case 6: return 105; case 7: case 8: return 118; case 9: case 10: case 11: return 119; case 12: case 13: case 14: return 110; case 15: return 120; case 16: case 17: case 18: return 111; case 19: return 121; case 20: case 21: case 22: return 113; case 23: case 24: return 123; case 25: return 114; case 26: case 27: return 1142; case 28: return 116; default: return 1142; } } public static short RgvPosStaTwo(Short posId){ switch (posId.intValue()){ case 1: return 116; case 2: return 1142; case 3: case 4: return 114; case 5: return 123; case 6: case 7: case 8: return 113; case 9: case 10: return 121; case 11: case 12: case 13: case 14: return 120; case 15: return 110; case 16: case 17: case 18: return 119; case 19: return 108; case 20: case 21: case 22: return 107; case 23: case 24: return 105; case 25: case 26: case 27: case 28: return 104; default: return 104; } } public static Integer CrnStaEnd(Integer endSta,Integer souSta) { switch (souSta) { case 100: case 103: case 106: case 109: case 112: case 115: return souSta + 1; default: return endSta; } } }