|  |  | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSON; | 
 |  |  | import com.baomidou.mybatisplus.mapper.EntityWrapper; | 
 |  |  | import com.baomidou.mybatisplus.mapper.Wrapper; | 
 |  |  | import com.core.common.Arith; | 
 |  |  | import com.core.common.Cools; | 
 |  |  | import com.core.common.SpringUtils; | 
 |  |  | import com.zy.asrs.entity.BasShuttle; | 
 |  |  | import com.zy.asrs.entity.LocMast; | 
 |  |  | import com.zy.asrs.entity.WrkMast; | 
 |  |  | import com.zy.asrs.mapper.WrkMastMapper; | 
 |  |  | import com.zy.asrs.service.BasShuttleService; | 
 |  |  | import com.zy.asrs.service.LocMastService; | 
 |  |  | import com.zy.asrs.service.WrkMastService; | 
 |  |  | import com.zy.asrs.service.impl.MainServiceImpl; | 
 |  |  | import com.zy.common.model.NavigateNode; | 
 |  |  | import com.zy.common.model.enums.NavigationMapType; | 
 |  |  | import com.zy.common.service.CommonService; | 
 |  |  | import com.zy.common.utils.NavigateMapData; | 
 |  |  | import com.zy.common.utils.NavigatePositionConvert; | 
 |  |  | import com.zy.common.utils.NavigateUtils; | 
 |  |  | import com.zy.common.utils.ShuttleDispatchUtils; | 
 |  |  | import com.zy.core.Slave; | 
 |  |  | import com.zy.core.cache.MessageQueue; | 
 |  |  | import com.zy.core.DevpThread; | 
 |  |  | import com.zy.core.cache.SlaveConnection; | 
 |  |  | import com.zy.core.enums.ShuttleRunDirection; | 
 |  |  | import com.zy.core.enums.ShuttleTaskModeType; | 
 |  |  | import com.zy.core.enums.SlaveType; | 
 |  |  | import com.zy.core.model.DevpSlave; | 
 |  |  | import com.zy.core.model.ShuttleSlave; | 
 |  |  | import com.zy.core.model.Task; | 
 |  |  | import com.zy.core.model.command.ShuttleAssignCommand; | 
 |  |  | import com.zy.core.model.command.ShuttleCommand; | 
 |  |  | import com.zy.core.model.protocol.NyShuttleProtocol; | 
 |  |  | import com.zy.core.model.protocol.ShuttleProtocol; | 
 |  |  | import com.zy.core.model.protocol.StaProtocol; | 
 |  |  | import com.zy.core.properties.SlaveProperties; | 
 |  |  | import com.zy.core.thread.NyShuttleThread; | 
 |  |  | import com.zy.core.thread.ShuttleThread; | 
 |  |  |  | 
 |  |  | import java.text.DecimalFormat; | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.Arrays; | 
 |  |  | import java.util.Collections; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.regex.Pattern; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by vincent on 2020/8/27 | 
 |  |  | 
 |  |  |     public static Integer getGroupRow(String locNo, Boolean pakin){ | 
 |  |  |         int row = getRow(locNo); | 
 |  |  |         return getGroupRow(row, pakin); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static List<String> getGroupLocNo(String locNo){ | 
 |  |  |         int row = getRow(locNo); | 
 |  |  |         List<String> result = new ArrayList<>(); | 
 |  |  |         if (FIRST_GROUP_ROW_LIST.contains(row)) { | 
 |  |  |             for (Integer groupRow : FIRST_GROUP_ROW_LIST) { | 
 |  |  |                 result.add(zerofill(String.valueOf(groupRow), 2) + locNo.substring(2)); | 
 |  |  |             } | 
 |  |  |         } else if (SECOND_GROUP_ROW_LIST.contains(row)) { | 
 |  |  |             for (Integer groupRow : SECOND_GROUP_ROW_LIST) { | 
 |  |  |                 result.add(zerofill(String.valueOf(groupRow), 2) + locNo.substring(2)); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static Integer getGroupRow(Integer row, Boolean pakin) { | 
 |  |  | 
 |  |  |         throw new RuntimeException("库位解析异常"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取外侧方向的库位组 | 
 |  |  |      * @param locNo 库位号 | 
 |  |  |      */ | 
 |  |  |     public static List<String> getGroupOuterLoc(String locNo){ | 
 |  |  |         int row = getRow(locNo); | 
 |  |  |         int bay = getBay(locNo); | 
 |  |  |  | 
 |  |  |         //(1,3,4,10,11)没有外侧方向库位组,(13,14,16)59列之内没有外侧方向库位组 | 
 |  |  |         if (FIRST_GROUP_ROW_LIST.contains(row)) {//1排 | 
 |  |  |             return new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         if (SECOND_GROUP_ROW_LIST.contains(row)) {//3-4排 | 
 |  |  |             return new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         if (THIRD_GROUP_ROW_LIST.contains(row)) {//6-7排 | 
 |  |  |             List<String> result = new ArrayList<>(); | 
 |  |  |             for (Integer row0 : THIRD_GROUP_ROW_LIST) { | 
 |  |  |                 if (row0 < row) { | 
 |  |  |                     result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2)); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  |         if (FOURTH_GROUP_ROW_LIST.contains(row)) {//8排 | 
 |  |  |             return new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         if (FIFTH_GROUP_ROW_LIST.contains(row)) {//10-11排 | 
 |  |  |             return new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         if (SIXTH_GROUP_ROW_LIST.contains(row) && (bay >= 59 && bay <= 61)) {//13-16排59-61列外侧方向库位组 | 
 |  |  |             List<String> result = new ArrayList<>(); | 
 |  |  |             for (Integer row0 : SIXTH_GROUP_ROW_LIST) { | 
 |  |  |                 if (row0 < row) { | 
 |  |  |                     result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2)); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  |         if (SEVENTH_GROUP_ROW_LIST.contains(row) && bay < 59) {//13-14排59列之内没有外侧方向库位组 | 
 |  |  |             return new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         if (EIGHTH_GROUP_ROW_LIST.contains(row) && bay < 59) {//16排59列之内没有外侧方向库位组 | 
 |  |  |             return new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         throw new RuntimeException("库位解析异常"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //获取除白名单外的指定楼层全部穿梭车xy坐标点 | 
 |  |  |     public static List<int[]> getShuttlePoints(Integer whiteShuttle, Integer lev) { | 
 |  |  |         BasShuttleService basShuttleService = SpringUtils.getBean(BasShuttleService.class); | 
 |  |  | 
 |  |  |         NavigateMapData mapData = new NavigateMapData(z);//获取地图数据 | 
 |  |  |         int[][] data = mapData.getData(-1, null, currentShuttleId == null ? null : Utils.getShuttlePoints(0, z));//载入全部车辆 | 
 |  |  |  | 
 |  |  |         int moveBay = 23;//避让起始列 | 
 |  |  |         int bay = Utils.getBay(shuttleProtocol.getCurrentLocNo());//小车当前列 | 
 |  |  |         if (bay > 1 && bay <= 30) { | 
 |  |  |             moveBay = 23; | 
 |  |  |         } else if (bay > 30 && bay <= 45) { | 
 |  |  |             moveBay = 39; | 
 |  |  |         } else if (bay > 45) { | 
 |  |  |             moveBay = 50; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         int distY = -1; | 
 |  |  |         int distX = -1; | 
 |  |  |         int distZ = -1; | 
 |  |  |         //获取避让库位 | 
 |  |  |         String distLocNo = null; | 
 |  |  |         for (int y = 20; y <= 56; y++) { | 
 |  |  |         for (int y = moveBay; y <= 56; y++) { | 
 |  |  |             boolean searchFlag = true; | 
 |  |  |             for (int x = 10; x <= 11; x++) { | 
 |  |  |                 if (data[x][y] < 0 || data[x][y] == 66) { | 
 |  |  | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //通过提升机号和楼层获取出入库模式 | 
 |  |  |     public static Integer getOutInModelByLift(Integer liftNo, Integer lev) { | 
 |  |  |         ArrayList<Integer> lev1 = new ArrayList<Integer>() {{ | 
 |  |  |             add(100);add(103); | 
 |  |  |             add(105); | 
 |  |  |         }}; | 
 |  |  |         ArrayList<Integer> lev2 = new ArrayList<Integer>() {{ | 
 |  |  |             add(200);add(203); | 
 |  |  |             add(205); | 
 |  |  |         }}; | 
 |  |  |         ArrayList<Integer> lev3 = new ArrayList<Integer>() {{ | 
 |  |  |             add(341);add(346); | 
 |  |  |         }}; | 
 |  |  |  | 
 |  |  |         Integer staNo = null; | 
 |  |  |         if (lev <= 4) { | 
 |  |  |             staNo = lev1.get(liftNo - 1); | 
 |  |  |         } else if (lev >= 5 && lev <= 7) { | 
 |  |  |             staNo = lev2.get(liftNo - 1); | 
 |  |  |         } else if ((lev >=8 && lev <= 10) && liftNo != 1) { | 
 |  |  |             staNo = lev3.get(liftNo - 2); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (staNo != null) { | 
 |  |  |             DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1); | 
 |  |  |             StaProtocol staProtocol = devpThread.getStation().get(staNo); | 
 |  |  |             if (staProtocol == null) { | 
 |  |  |                 return null; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (staNo == 100 || staNo == 200) {//1号提升机100站和200站默认全是出库模式 | 
 |  |  |                 return 2;//出库模式 | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (staNo == 341) { | 
 |  |  |                 return 1;//341站默认只能入库模式 | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (staProtocol.getOutInModel() == null) { | 
 |  |  |                 return null;//没有出入库信号 | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             return staProtocol.getOutInModel().intValue(); | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static void wapperSetCondition(Wrapper wrapper, String column, String condition){ | 
 |  |  |         if(Cools.isEmpty(condition) || "null".equals(condition)){ | 
 |  |  |             wrapper.andNew().eq(column,"").or().isNull(column); | 
 |  |  |         }else { | 
 |  |  |             wrapper.eq(column,condition); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取内侧方向的库位组 | 
 |  |  |      * @param locNo 库位号 | 
 |  |  |      */ | 
 |  |  |     public static List<String> getGroupInnerLoc(String locNo){ | 
 |  |  |         int row = getRow(locNo); | 
 |  |  |         int bay = getBay(locNo); | 
 |  |  |  | 
 |  |  |         //(1,3,4,10,11)没有内侧方向库位组,(13,14,16)59列之内没有内侧方向库位组 | 
 |  |  |         if (FIRST_GROUP_ROW_LIST.contains(row)) {//1排 | 
 |  |  |             return new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         if (SECOND_GROUP_ROW_LIST.contains(row)) {//3-4排 | 
 |  |  |             return new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         if (THIRD_GROUP_ROW_LIST.contains(row)) {//6-7排 | 
 |  |  |             List<String> result = new ArrayList<>(); | 
 |  |  |             for (Integer row0 : THIRD_GROUP_ROW_LIST) { | 
 |  |  |                 if (row0 > row) { | 
 |  |  |                     result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2)); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  |         if (FOURTH_GROUP_ROW_LIST.contains(row)) {//8排 | 
 |  |  |             return new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         if (FIFTH_GROUP_ROW_LIST.contains(row)) {//10-11排 | 
 |  |  |             return new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         if (SIXTH_GROUP_ROW_LIST.contains(row) && (bay >= 59 && bay <= 61)) {//13-16排59-61列内侧方向库位组 | 
 |  |  |             List<String> result = new ArrayList<>(); | 
 |  |  |             for (Integer row0 : SIXTH_GROUP_ROW_LIST) { | 
 |  |  |                 if (row0 > row) { | 
 |  |  |                     result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2)); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  |         if (SEVENTH_GROUP_ROW_LIST.contains(row) && bay < 59) {//13-14排59列之内没有内侧方向库位组 | 
 |  |  |             return new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         if (EIGHTH_GROUP_ROW_LIST.contains(row) && bay < 59) {//16排59列之内没有内侧方向库位组 | 
 |  |  |             return new ArrayList<>(); | 
 |  |  |         } | 
 |  |  |         throw new RuntimeException("库位解析异常"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 通过入库站点号获取条码器ID | 
 |  |  |      */ | 
 |  |  |     public static Integer getBarcodeIdByStaNo(int staNo) { | 
 |  |  |         SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class); | 
 |  |  |         for (DevpSlave devpSlave : slaveProperties.getDevp()) { | 
 |  |  |             for (DevpSlave.Sta sta : devpSlave.getInSta()) { | 
 |  |  |                 if (sta.getStaNo().equals(staNo)) { | 
 |  |  |                     return sta.getBarcode(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |     /** | 
 |  |  |      * 判断字符串是否为JSON格式 | 
 |  |  |      */ | 
 |  |  |     public static boolean isJson(String jsonString) { | 
 |  |  |         // JSON格式的正则表达式 | 
 |  |  |         String pattern = "^\\{.*\\}$"; | 
 |  |  |         // 使用Pattern类进行正则匹配 | 
 |  |  |         return Pattern.matches(pattern, jsonString); | 
 |  |  |     } | 
 |  |  | } |