package com.zy.asrs.utils;
|
|
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.service.BasShuttleService;
|
import com.zy.asrs.service.LocMastService;
|
import com.zy.asrs.service.WrkMastService;
|
import com.zy.common.service.CommonService;
|
import com.zy.common.utils.NavigateMapData;
|
import com.zy.common.utils.NavigatePositionConvert;
|
import com.zy.common.utils.ShuttleDispatchUtils;
|
import com.zy.core.DevpThread;
|
import com.zy.core.cache.SlaveConnection;
|
import com.zy.core.enums.SlaveType;
|
import com.zy.core.model.DevpSlave;
|
import com.zy.core.model.ShuttleSlave;
|
import com.zy.core.model.protocol.NyShuttleProtocol;
|
import com.zy.core.model.protocol.StaProtocol;
|
import com.zy.core.properties.SlaveProperties;
|
import com.zy.core.thread.NyShuttleThread;
|
|
import java.text.DecimalFormat;
|
import java.util.*;
|
import java.util.regex.Pattern;
|
|
/**
|
* Created by vincent on 2020/8/27
|
*/
|
public class Utils {
|
|
public static final List<Integer> FIRST_GROUP_ROW_LIST = new ArrayList<Integer>() {{
|
add(1);
|
}};
|
public static final List<Integer> SECOND_GROUP_ROW_LIST = new ArrayList<Integer>() {{
|
add(3);add(4);
|
}};
|
public static final List<Integer> THIRD_GROUP_ROW_LIST = new ArrayList<Integer>() {{
|
add(6);add(7);
|
}};
|
public static final List<Integer> FOURTH_GROUP_ROW_LIST = new ArrayList<Integer>() {{
|
add(8);
|
}};
|
public static final List<Integer> FIFTH_GROUP_ROW_LIST = new ArrayList<Integer>() {{
|
add(10);add(11);
|
}};
|
public static final List<Integer> SIXTH_GROUP_ROW_LIST = new ArrayList<Integer>() {{
|
add(13);add(14);add(15);add(16);
|
}};
|
public static final List<Integer> SEVENTH_GROUP_ROW_LIST = new ArrayList<Integer>() {{
|
add(13);add(14);
|
}};
|
public static final List<Integer> EIGHTH_GROUP_ROW_LIST = new ArrayList<Integer>() {{
|
add(16);
|
}};
|
|
private static final DecimalFormat fmt = new DecimalFormat("##0.00");
|
|
public static float scale(Float f){
|
if (f == null || f == 0f || Float.isNaN(f)) {
|
return 0f;
|
}
|
return (float) Arith.multiplys(2, f, 1);
|
}
|
|
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();
|
}
|
}
|
|
public static Integer getGroupRow(String locNo, Boolean pakin){
|
int row = getRow(locNo);
|
return getGroupRow(row, pakin);
|
}
|
|
public static Integer getGroupRow(Integer row, Boolean pakin) {
|
if (FIRST_GROUP_ROW_LIST.contains(row)) {
|
return 4;
|
} else if (SECOND_GROUP_ROW_LIST.contains(row)) {
|
return 5;
|
} else {
|
return 0;
|
}
|
// if (pakin) {
|
// if (FIRST_GROUP_ROW_LIST.contains(row)) {
|
// return 2;
|
// } else if (SECOND_GROUP_ROW_LIST.contains(row)) {
|
// return 18;
|
// } else {
|
// return 0;
|
// }
|
// } else {
|
// if (FIRST_GROUP_ROW_LIST.contains(row)) {
|
// return 12;
|
// } else if (SECOND_GROUP_ROW_LIST.contains(row)) {
|
// return 30;
|
// } else {
|
// return 0;
|
// }
|
// }
|
}
|
|
/**
|
* 通过库位号获取 排
|
*/
|
public static int getRow(String locNo) {
|
if (!Cools.isEmpty(locNo)) {
|
return Integer.parseInt(locNo.substring(0, 2));
|
}
|
throw new RuntimeException("库位解析异常");
|
}
|
|
/**
|
* 通过库位号获取 列
|
*/
|
public static int getBay(String locNo) {
|
if (!Cools.isEmpty(locNo)) {
|
return Integer.parseInt(locNo.substring(2, 5));
|
}
|
throw new RuntimeException("库位解析异常");
|
}
|
|
/**
|
* 通过库位号获取 层
|
*/
|
public static int getLev(String locNo) {
|
if (!Cools.isEmpty(locNo)) {
|
return Integer.parseInt(locNo.substring(5, 7));
|
}
|
throw new RuntimeException("库位解析异常");
|
}
|
|
/**
|
* 通过排列层拼接出库位号
|
*/
|
public static String append(int row, int bay, int lev) {
|
return zerofill(String.valueOf(row), 2) + zerofill(String.valueOf(bay), 3) + zerofill(String.valueOf(lev), 2);
|
}
|
|
public static String getLocNo(Number row, Number bay, Number lev) {
|
return zerofill(String.valueOf(row), 2) + zerofill(String.valueOf(bay), 3) + zerofill(String.valueOf(lev), 2);
|
}
|
|
public static void main(String[] args) {
|
System.out.println(JSON.toJSONString(getGroupLoc("1606101")));
|
}
|
|
/**
|
* 获取库位组
|
* @param locNo 库位号
|
*/
|
public static List<String> getGroupLoc(String locNo){
|
int row = getRow(locNo);
|
int bay = getBay(locNo);
|
if (FIRST_GROUP_ROW_LIST.contains(row)) {
|
List<String> result = new ArrayList<>();
|
for (Integer row0 : FIRST_GROUP_ROW_LIST) {
|
result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2));
|
}
|
return result;
|
}
|
if (SECOND_GROUP_ROW_LIST.contains(row)) {
|
List<String> result = new ArrayList<>();
|
for (Integer row0 : SECOND_GROUP_ROW_LIST) {
|
result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2));
|
}
|
return result;
|
}
|
if (THIRD_GROUP_ROW_LIST.contains(row)) {
|
List<String> result = new ArrayList<>();
|
for (Integer row0 : THIRD_GROUP_ROW_LIST) {
|
result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2));
|
}
|
Collections.reverse(result);
|
return result;
|
}
|
if (FOURTH_GROUP_ROW_LIST.contains(row)) {
|
List<String> result = new ArrayList<>();
|
for (Integer row0 : FOURTH_GROUP_ROW_LIST) {
|
result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2));
|
}
|
return result;
|
}
|
if (FIFTH_GROUP_ROW_LIST.contains(row)) {
|
List<String> result = new ArrayList<>();
|
for (Integer row0 : FIFTH_GROUP_ROW_LIST) {
|
result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2));
|
}
|
return result;
|
}
|
if (SIXTH_GROUP_ROW_LIST.contains(row) && (bay >= 59 && bay <= 61)) {
|
List<String> result = new ArrayList<>();
|
for (Integer row0 : SIXTH_GROUP_ROW_LIST) {
|
result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2));
|
}
|
Collections.reverse(result);
|
return result;
|
}
|
if (SEVENTH_GROUP_ROW_LIST.contains(row) && bay < 59) {
|
List<String> result = new ArrayList<>();
|
for (Integer row0 : SEVENTH_GROUP_ROW_LIST) {
|
result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2));
|
}
|
return result;
|
}
|
if (EIGHTH_GROUP_ROW_LIST.contains(row) && bay < 59) {
|
List<String> result = new ArrayList<>();
|
for (Integer row0 : EIGHTH_GROUP_ROW_LIST) {
|
result.add(zerofill(String.valueOf(row0), 2) + locNo.substring(2));
|
}
|
return result;
|
}
|
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);
|
SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class);
|
ArrayList<int[]> list = new ArrayList<>();
|
for (ShuttleSlave slave : slaveProperties.getShuttle()) {
|
if (slave.getId().intValue() == whiteShuttle) {
|
continue;//跳过白名单
|
}
|
|
//获取穿梭车所在节点位置
|
NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, slave.getId());
|
if (shuttleThread == null) {
|
continue;
|
}
|
NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
|
if (shuttleProtocol == null) {
|
continue;
|
}
|
|
String currentLocNo = shuttleProtocol.getCurrentLocNo();
|
|
if (currentLocNo == null) {
|
//小车没有库位号数据,从数据库中取
|
BasShuttle basShuttle = basShuttleService.selectById(slave.getId());
|
if (basShuttle == null) {
|
continue;
|
}
|
NyShuttleProtocol.NyShuttlePointClass shuttlePoint = shuttleProtocol.getPoint();
|
currentLocNo = NavigatePositionConvert.nyXyzToLocNo(shuttlePoint.getX(), shuttlePoint.getY(), shuttlePoint.getZ());
|
}
|
|
if (lev != Utils.getLev(currentLocNo)) {
|
continue;//楼层不同
|
}
|
|
if (shuttleProtocol.getCurrentLocNo() == null) {
|
continue;
|
}
|
int[] xyPosition = NavigatePositionConvert.positionToXY(shuttleProtocol.getCurrentLocNo());//通过库位号获取xy坐标
|
list.add(xyPosition);
|
}
|
return list;
|
}
|
|
//搜索一条没有小车的空巷道,并调度小车
|
public static boolean searchEmptyGroupToMoveShuttle(int z, Integer currentShuttleId, NyShuttleThread shuttleThread) {
|
LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
|
WrkMastService wrkMastService = SpringUtils.getBean(WrkMastService.class);
|
CommonService commonService = SpringUtils.getBean(CommonService.class);
|
ShuttleDispatchUtils shuttleDispatchUtils = SpringUtils.getBean(ShuttleDispatchUtils.class);
|
NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class);
|
|
if (shuttleThread == null) {
|
return false;
|
}
|
NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
|
if (shuttleProtocol == null) {
|
return false;
|
}
|
|
int[][] data = navigateMapData.getData(z, -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 = moveBay; y <= 56; y++) {
|
boolean searchFlag = true;
|
for (int x = 10; x <= 11; x++) {
|
if (data[x][y] < 0 || data[x][y] == 66) {
|
searchFlag = false;//该巷道有禁用节点或有小车
|
break;
|
}
|
}
|
|
if (searchFlag) {
|
//搜索出空巷道
|
distY = y;
|
distX = 11;
|
distZ = z;
|
|
//获取避让库位
|
String locNo = NavigatePositionConvert.xyzToLocNo(distX, distY, distZ);
|
LocMast distLocMast = locMastService.queryByLoc(locNo);
|
if (distLocMast == null) {
|
continue;
|
}
|
|
if (distLocMast.getLocSts().equals("X")) {
|
continue;//调过禁用库位
|
}
|
|
//判断该库位是否存在工作档
|
EntityWrapper<WrkMast> wrapper = new EntityWrapper<>();
|
wrapper.eq("loc_no", locNo);
|
WrkMast wrkMast = wrkMastService.selectOne(wrapper);
|
if (wrkMast != null) {
|
continue;//存在工作档跳过该库位
|
}
|
|
distLocNo = locNo;
|
break;
|
}
|
}
|
|
if (distLocNo != null) {
|
//调度小车到避让位置
|
return shuttleDispatchUtils.dispatchShuttle(commonService.getWorkNo(7), distLocNo, shuttleProtocol.getShuttleNo().intValue());
|
}
|
return false;
|
}
|
|
//检测楼层是否有穿梭车
|
public static boolean checkLevHasShuttle(Integer lev) {
|
SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class);
|
for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
|
//获取四向穿梭车线程
|
NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
|
if (shuttleThread == null) {
|
continue;
|
}
|
NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
|
if (shuttleProtocol == null) {
|
continue;
|
}
|
String currentLocNo = shuttleProtocol.getCurrentLocNo();
|
if (currentLocNo == null) {
|
continue;
|
}
|
|
if (lev == Utils.getLev(currentLocNo)) {
|
return true;//指定楼层有穿梭车
|
}
|
}
|
|
return false;//指定楼层没有穿梭车
|
}
|
|
//检测库位组是否存在小车,存在返回小车号。
|
public static Integer checkGroupLocHasShuttle(List<String> groupLoc) {
|
if (groupLoc == null) {
|
return null;
|
}
|
|
if (groupLoc.isEmpty()) {
|
return null;
|
}
|
|
SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class);
|
if (slaveProperties == null) {
|
return null;
|
}
|
|
for (String loc : groupLoc) {
|
for (ShuttleSlave slave : slaveProperties.getShuttle()) {
|
NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, slave.getId());
|
if (shuttleThread == null) {
|
continue;
|
}
|
|
NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
|
if (shuttleProtocol == null) {
|
continue;
|
}
|
|
if (shuttleProtocol.getCurrentLocNo() == null) {
|
continue;
|
}
|
|
if (shuttleProtocol.getCurrentLocNo().equals(loc)) {
|
//存在小车
|
return slave.getId();
|
}
|
}
|
}
|
|
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);
|
}
|
}
|