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;//有任务绑定
|
}
|
|
}
|