| | |
| | | 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.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.List; |
| | | |
| | | public class Utils { |
| | | |
| | | public static final String _LINK = "-"; |
| | | |
| | | /** |
| | | * 通过库位号获取 排 |
| | | */ |
| | | 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) { |
| | | // SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class); |
| | | DeviceService deviceService = SpringUtils.getBean(DeviceService.class); |
| | | ArrayList<int[]> list = new ArrayList<>(); |
| | | // for (ShuttleSlave slave : slaveProperties.getShuttle()) { |
| | | // if (slave.getId().intValue() == whiteShuttle) { |
| | | // continue;//跳过白名单 |
| | | // } |
| | | // |
| | | // //获取穿梭车所在节点位置 |
| | | // ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, slave.getId()); |
| | | // if (shuttleThread == null) { |
| | | // continue; |
| | | // } |
| | | // ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); |
| | | // 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); |
| | | // } |
| | | |
| | | 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.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) { |
| | | TaskService taskService = SpringUtils.getBean(TaskService.class); |
| | | List<Task> tasks = taskService.selectWorkingByShuttle(Integer.parseInt(device.getDeviceNo())); |
| | | if (tasks.isEmpty()) { |
| | | return false;//无任务绑定 |
| | | } |
| | | return true;//有任务绑定 |
| | | } |
| | | |
| | | /** |
| | | * 检测提升机是否有任务绑定 |
| | | */ |
| | | public static boolean checkLiftHasBinding(Integer liftNo) { |
| | | TaskService taskService = SpringUtils.getBean(TaskService.class); |
| | | List<Task> tasks = taskService.selectWorkingByLift(liftNo); |
| | | if (tasks.isEmpty()) { |
| | | return false;//无任务绑定 |
| | | } |
| | | return true;//有任务绑定 |
| | | } |
| | | |
| | | /** |
| | | * 获取距离目标库位最近的提升机 |
| | | */ |
| | | public static Device getRecentTransferLift(String locNo, Integer shuttleNo) { |
| | | BasLiftService basLiftService = SpringUtils.getBean(BasLiftService.class); |
| | | DeviceService deviceService = SpringUtils.getBean(DeviceService.class); |
| | | if (basLiftService == null) { |
| | | return null; |
| | | } |
| | | |
| | | Integer distance = Integer.MAX_VALUE; |
| | | Long liftDeviceId = null; |
| | | for (BasLift basLift : basLiftService.list(new LambdaQueryWrapper<BasLift>() |
| | | .eq(BasLift::getStatus, 1) |
| | | .eq(BasLift::getTransfer, 1))) { |
| | | int lev = Utils.getLev(locNo); |
| | | String liftLocNo = Utils.getLocNo(basLift.getRow(), basLift.getBay(), lev); |
| | | List<NavigateNode> nodeList = NavigateUtils.calc(locNo, liftLocNo, NavigationMapType.NONE.id, Utils.getShuttlePoints(shuttleNo, Utils.getLev(locNo))); |
| | | Integer originPathAllDistance = NavigateUtils.getOriginPathAllDistance(nodeList);//总距离 |
| | | if (originPathAllDistance < distance) { |
| | | distance = originPathAllDistance; |
| | | liftDeviceId = basLift.getDeviceId(); |
| | | } |
| | | } |
| | | |
| | | if (liftDeviceId == null) { |
| | | return null; |
| | | } |
| | | |
| | | Device device = deviceService.getById(liftDeviceId); |
| | | if (device == null) { |
| | | return null; |
| | | } |
| | | return device; |
| | | } |
| | | |
| | | } |