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.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 getShuttlePoints(Integer whiteShuttle, Integer lev) { DeviceService deviceService = SpringUtils.getBean(DeviceService.class); ArrayList list = new ArrayList<>(); List devices = deviceService.list(new LambdaQueryWrapper() .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 list = deviceService.list(new LambdaQueryWrapper() .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() .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() .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 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 tasks = taskService.selectWorkingByLift(liftNo, taskNo); if (tasks.isEmpty()) { return false;//无任务绑定 } return true;//有任务绑定 } }