| package com.zy.asrs.wcs.core.utils; | 
|   | 
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
| import com.zy.asrs.framework.common.Cools; | 
| import com.zy.asrs.framework.common.SpringUtils; | 
| import com.zy.asrs.framework.exception.CoolException; | 
| import com.zy.asrs.wcs.core.entity.BasLift; | 
| import com.zy.asrs.wcs.core.entity.Task; | 
| import com.zy.asrs.wcs.core.entity.TaskSerialNo; | 
| import com.zy.asrs.wcs.core.model.NavigateNode; | 
| import com.zy.asrs.wcs.core.model.enums.DeviceCtgType; | 
| import com.zy.asrs.wcs.core.model.enums.NavigationMapType; | 
| import com.zy.asrs.wcs.core.service.BasLiftService; | 
| import com.zy.asrs.wcs.core.service.TaskSerialNoService; | 
| import com.zy.asrs.wcs.core.service.TaskService; | 
| import com.zy.asrs.wcs.rcs.cache.SlaveConnection; | 
| import com.zy.asrs.wcs.rcs.entity.Device; | 
| import com.zy.asrs.wcs.rcs.model.enums.ShuttleProtocolStatusType; | 
| import com.zy.asrs.wcs.rcs.model.enums.SlaveType; | 
| import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol; | 
| import com.zy.asrs.wcs.rcs.service.DeviceService; | 
| import com.zy.asrs.wcs.rcs.thread.ShuttleThread; | 
|   | 
| import java.util.ArrayList; | 
| import java.util.HashMap; | 
| import java.util.List; | 
|   | 
| public class Utils { | 
|   | 
|     public static final String _LINK = "-"; | 
|   | 
|     public static Integer getStaByLev(Integer lev) { | 
|         HashMap<Integer, Integer> map = new HashMap<>(); | 
|         map.put(1, 31006); | 
|         map.put(2, 31007); | 
|         map.put(3, 31008); | 
|   | 
|         return map.get(lev); | 
|     } | 
|   | 
|     /** | 
|      * 通过库位号获取 排 | 
|      */ | 
|     public static int getRow(String locNo) { | 
|         if (!Cools.isEmpty(locNo)) { | 
|             String[] split = locNo.split(_LINK); | 
|             return Integer.parseInt(split[0]); | 
|         } | 
|         throw new RuntimeException("库位解析异常"); | 
|     } | 
|   | 
|     /** | 
|      * 通过库位号获取 列 | 
|      */ | 
|     public static int getBay(String locNo) { | 
|         if (!Cools.isEmpty(locNo)) { | 
|             String[] split = locNo.split(_LINK); | 
|             return Integer.parseInt(split[1]); | 
|         } | 
|         throw new RuntimeException("库位解析异常"); | 
|     } | 
|   | 
|     /** | 
|      * 通过库位号获取 层 | 
|      */ | 
|     public static int getLev(String locNo) { | 
|         if (!Cools.isEmpty(locNo)) { | 
|             String[] split = locNo.split(_LINK); | 
|             return Integer.parseInt(split[2]); | 
|         } | 
|         throw new RuntimeException("库位解析异常"); | 
|     } | 
|   | 
|     public static String getLocNo(Number row, Number bay, Number lev) { | 
|         return row + _LINK + bay + _LINK + lev; | 
| //        return zerofill(String.valueOf(row), 2) + zerofill(String.valueOf(bay), 3) + zerofill(String.valueOf(lev), 2); | 
|     } | 
|   | 
|     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<count-msg.length(); i++){ | 
|                 msgBuilder.insert(0,"0"); | 
|             } | 
|             return msgBuilder.toString(); | 
|         } | 
|     } | 
|   | 
|     //获取除白名单外的指定楼层全部穿梭车xy坐标点 | 
|     public static List<int[]> getShuttlePoints(Integer whiteShuttle, Integer lev) { | 
|         DeviceService deviceService = SpringUtils.getBean(DeviceService.class); | 
|         ArrayList<int[]> list = new ArrayList<>(); | 
|   | 
|         List<Device> devices = deviceService.list(new LambdaQueryWrapper<Device>() | 
|                 .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val()) | 
|                 .eq(Device::getStatus, 1)); | 
|         for (Device device : devices) { | 
|             if (Integer.parseInt(device.getDeviceNo()) == whiteShuttle) { | 
|                 continue;//跳过白名单 | 
|             } | 
|   | 
|             //获取穿梭车所在节点位置 | 
|             ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue()); | 
|             if (shuttleThread == null) { | 
|                 continue; | 
|             } | 
|             ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); | 
|             if (shuttleProtocol == null) { | 
|                 continue; | 
|             } | 
|   | 
|             if (shuttleProtocol.getCurrentLocNo() == null) { | 
|                 continue; | 
|             } | 
|   | 
|             if (lev != Utils.getLev(shuttleProtocol.getCurrentLocNo())) { | 
|                 continue;//楼层不同 | 
|             } | 
|   | 
|             int[] xyPosition = NavigatePositionConvert.positionToXY(shuttleProtocol.getCurrentLocNo());//通过库位号获取xy坐标 | 
|             list.add(xyPosition); | 
|         } | 
|         return list; | 
|     } | 
|   | 
|     public static boolean hasShuttleInLoc(String locNo, Long deviceId) { | 
|         DeviceService deviceService = SpringUtils.getBean(DeviceService.class); | 
|   | 
|         List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>() | 
|                 .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val()) | 
|                 .eq(Device::getStatus, 1)); | 
|   | 
|         for (Device device : list) { | 
|             if (deviceId.equals(device.getId())) { | 
|                 continue; | 
|             } | 
|   | 
|             //获取四向穿梭车线程 | 
|             ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue()); | 
|             if (shuttleThread == null) { | 
|                 continue; | 
|             } | 
|   | 
|             ShuttleProtocol shuttleProtocol = shuttleThread.getStatus(); | 
|             if (shuttleProtocol == null) { | 
|                 continue; | 
|             } | 
|   | 
|             if (shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.OFFLINE)) { | 
|                 continue; | 
|             } | 
|   | 
|             if (shuttleProtocol.getCurrentLocNo() == null) { | 
|                 continue; | 
|             } | 
|   | 
|             if (shuttleProtocol.getCurrentLocNo().equals(locNo)) { | 
|                 return true; | 
|             } | 
|         } | 
|   | 
|         return false; | 
|     } | 
|   | 
|     /** | 
|      * 生成工作号 | 
|      * @return taskNo(工作号) | 
|      */ | 
|     public static int getTaskNo(String flag) { | 
|         TaskSerialNoService taskSerialNoService = SpringUtils.getBean(TaskSerialNoService.class); | 
|         TaskService taskService = SpringUtils.getBean(TaskService.class); | 
|         TaskSerialNo taskSerialNo = taskSerialNoService.getOne(new LambdaQueryWrapper<TaskSerialNo>() | 
|                 .eq(TaskSerialNo::getFlag, flag) | 
|                 .eq(TaskSerialNo::getStatus, 1)); | 
|         if (Cools.isEmpty(taskSerialNo)) { | 
|             throw new CoolException("数据异常,请联系管理员"); | 
|         } | 
|   | 
|         int taskNo = taskSerialNo.getTaskNo(); | 
|         int sNo = taskSerialNo.getStartNo(); | 
|         int eNo = taskSerialNo.getTargetNo(); | 
|         taskNo = taskNo >= eNo ? sNo : taskNo + 1; | 
|         while (true) { | 
|             Task task = taskService.getOne(new LambdaQueryWrapper<Task>() | 
|                     .eq(Task::getTaskNo, taskNo)); | 
|             if (null != task) { | 
|                 taskNo = taskNo >= eNo ? sNo : taskNo + 1; | 
|             } else { | 
|                 break; | 
|             } | 
|         } | 
|         // 修改序号记录 | 
|         if (taskNo > 0){ | 
|             taskSerialNo.setTaskNo(taskNo); | 
|             taskSerialNoService.updateById(taskSerialNo); | 
|             return taskNo; | 
|         } | 
|         throw new CoolException("工作号生成失败"); | 
|     } | 
|   | 
|     /** | 
|      * 检测穿梭车是否有任务绑定 | 
|      */ | 
|     public static boolean checkShuttleHasBinding(Device device, String taskNo) { | 
|         TaskService taskService = SpringUtils.getBean(TaskService.class); | 
|         List<Task> tasks = taskService.selectWorkingByShuttle(Integer.parseInt(device.getDeviceNo()), taskNo); | 
|         if (tasks.isEmpty()) { | 
|             return false;//无任务绑定 | 
|         } | 
|         return true;//有任务绑定 | 
|     } | 
|   | 
|     /** | 
|      * 检测提升机是否有任务绑定 | 
|      */ | 
|     public static boolean checkLiftHasBinding(Integer liftNo) { | 
|         return checkLiftHasBinding(liftNo, null); | 
|     } | 
|   | 
|     /** | 
|      * 检测提升机是否有任务绑定 | 
|      */ | 
|     public static boolean checkLiftHasBinding(Integer liftNo, String taskNo) { | 
|         TaskService taskService = SpringUtils.getBean(TaskService.class); | 
|         List<Task> tasks = taskService.selectWorkingByLift(liftNo, taskNo); | 
|         if (tasks.isEmpty()) { | 
|             return false;//无任务绑定 | 
|         } | 
|         return true;//有任务绑定 | 
|     } | 
|   | 
| } |