自动化立体仓库 - WMS系统
#
zjj
2025-04-14 d0a69f760d5bb8361dc35ac4f4f98243e0409144
src/main/java/com/zy/asrs/utils/Utils.java
@@ -2,16 +2,155 @@
import com.core.common.Arith;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.RowLastno;
import com.zy.common.properties.SlaveProperties;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
 * Created by vincent on 2020/8/27
 */
public class Utils {
    public static final List<Integer> FIRST_GROUP_ROW_LIST = new ArrayList<Integer>() {{
        add(1);add(2);
    }};
    public static final List<Integer> SECOND_GROUP_ROW_LIST = new ArrayList<Integer>() {{
        add(3);add(4);
    }};
    public static final List<Integer> FIRST_GROUP_ROW_LIST2 = new ArrayList<Integer>() {{
        add(5);add(6);
    }};
    public static final List<Integer> SECOND_GROUP_ROW_LIST2 = new ArrayList<Integer>() {{
        add(7);add(8);
    }};
    public static final List<Integer> FIRST_GROUP_ROW_LIST3 = new ArrayList<Integer>() {{
        add(9);
    }};
    public static final List<Integer> SECOND_GROUP_ROW_LIST3 = new ArrayList<Integer>() {{
        add(10);
    }};
    //库位排号分配
    public static int[] LocNecessaryParameters(Integer whsType, Integer curRow, Integer crnNumber) {
        switch (whsType){
            case 1://经典双伸库位
                return LocNecessaryParametersDoubleExtension(whsType, curRow, crnNumber);
            default:
                return LocNecessaryParametersMove(whsType, curRow, crnNumber);//moveCrnNo
        }
    }
    public static boolean BooleanWhsTypeSta(Integer whsType) {
        if (whsType == 1) {
            return true;
        }
        return false;
    }
    //经典双伸库位移库
    public static int[] LocNecessaryParametersMove(Integer whsType, Integer curRow, Integer moveCrnNo) {
        int[] necessaryParameters = new int[]{0, 0, 0, 0};
        necessaryParameters[0] = 2; // 轮询次数
        if (curRow.equals(moveCrnNo*4-2)){
            necessaryParameters[1] = curRow+2;    //curRow   最深库位排
            necessaryParameters[2] = moveCrnNo;     //crnNo     堆垛机号
            necessaryParameters[3] = curRow+1;    //nearRow  最浅库位排
        }else {
            necessaryParameters[1] = curRow-2;    //curRow   最深库位排
            necessaryParameters[2] = moveCrnNo;     //crnNo     堆垛机号
            necessaryParameters[3] = curRow-1;    //nearRow  最浅库位排
        }
        return necessaryParameters;
    }
    //经典双伸库位
    public static int[] LocNecessaryParametersDoubleExtension(Integer whsType, Integer curRow, Integer crnNumber) {
        int[] necessaryParameters = new int[]{0, 0, 0, 0};
        if (BooleanWhsTypeSta(whsType)) {
            necessaryParameters[0] = crnNumber; // 轮询次数
            //满板正常入库
            if (curRow.equals(crnNumber * 4)) {
                necessaryParameters[1] = 1;    //curRow   最深库位排
                necessaryParameters[2] = 1;     //crnNo     堆垛机号
                necessaryParameters[3] = 2;    //nearRow  最浅库位排
            } else if (curRow.equals(crnNumber * 4 - 3)) {
                necessaryParameters[1] = 4;    //curRow   最深库位排
                necessaryParameters[2] = 1;     //crnNo     堆垛机号
                necessaryParameters[3] = 3;    //nearRow  最浅库位排
            } else {
                curRow = curRow + 4;
                if (curRow < 1 || curRow > (crnNumber * 4)) {
                    throw new CoolException("库位排号异常:排号:" + curRow);
                }
                if ((curRow - 1) % 4 == 0) {
                    necessaryParameters[1] = curRow;    //curRow   最深库位排
                    necessaryParameters[2] = (curRow + 3) / 4;     //crnNo     堆垛机号
                    necessaryParameters[3] = curRow + 1;    //nearRow  最浅库位排
                } else if (curRow % 4 == 0) {
                    necessaryParameters[1] = curRow;    //curRow   最深库位排
                    necessaryParameters[2] = curRow / 4;     //crnNo     堆垛机号
                    necessaryParameters[3] = curRow - 1;    //nearRow  最浅库位排
                } else {
                    throw new CoolException("库位排号异常:排号:" + curRow);
                }
            }
        }
        return necessaryParameters;
    }
    public static boolean BooleanWhsTypeStaIoType(RowLastno rowLastno) {  //查询相似物料开关
        return true;
    }
    public static List<String> getGroupLocNo(String locNo, Boolean pakIn) {
        int row = getRow(locNo);
        List<String> result = new ArrayList<>();
        if (FIRST_GROUP_ROW_LIST.contains(row)) {
            for (Integer groupRow : FIRST_GROUP_ROW_LIST) {
                result.add(zerofill(String.valueOf(groupRow), 2) + locNo.substring(2));
            }
        } else if (SECOND_GROUP_ROW_LIST.contains(row)) {
            List<Integer> clone = Arrays.asList(new Integer[SECOND_GROUP_ROW_LIST.size()]);
            Collections.copy(clone, SECOND_GROUP_ROW_LIST);
            Collections.reverse(clone);
            for (Integer integer : clone) {
                result.add(zerofill(String.valueOf(integer), 2) + locNo.substring(2));
            }
        }else if (FIRST_GROUP_ROW_LIST2.contains(row)) {
            for (Integer groupRow : FIRST_GROUP_ROW_LIST2) {
                result.add(zerofill(String.valueOf(groupRow), 2) + locNo.substring(2));
            }
        } else if (SECOND_GROUP_ROW_LIST2.contains(row)) {
            List<Integer> clone = Arrays.asList(new Integer[SECOND_GROUP_ROW_LIST2.size()]);
            Collections.copy(clone, SECOND_GROUP_ROW_LIST2);
            Collections.reverse(clone);
            for (Integer integer : clone) {
                result.add(zerofill(String.valueOf(integer), 2) + locNo.substring(2));
            }
        }else if (FIRST_GROUP_ROW_LIST3.contains(row)) {
            for (Integer groupRow : FIRST_GROUP_ROW_LIST3) {
                result.add(zerofill(String.valueOf(groupRow), 2) + locNo.substring(2));
            }
        } else if (SECOND_GROUP_ROW_LIST3.contains(row)) {
            List<Integer> clone = Arrays.asList(new Integer[SECOND_GROUP_ROW_LIST3.size()]);
            Collections.copy(clone, SECOND_GROUP_ROW_LIST3);
            Collections.reverse(clone);
            for (Integer integer : clone) {
                result.add(zerofill(String.valueOf(integer), 2) + locNo.substring(2));
            }
        }
        if (!pakIn) {
            //出库,反转数据
            Collections.reverse(result);
        }
        return result;
    }
    private static final DecimalFormat fmt = new DecimalFormat("##0.00");
@@ -144,6 +283,50 @@
    }
    /**
     * 通过库位号获取 列
     */
    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("库位解析异常");
    }
    /**
     * 通过排列层获取库位号
     *
     * @return
     */
    public static String getLocByRBL(int row, int bay, int lev) {
        StringBuffer sb = new StringBuffer();
        if (row < 10) {
            sb.append("0");
        }
        sb.append(row);
        if (bay < 10) {
            sb.append("00");
        } else if (bay < 100) {
            sb.append("0");
        }
        sb.append(bay);
        if (lev < 10) {
            sb.append("0");
        }
        sb.append(lev);
        return sb.toString();
    }
    /**
     * 当检索到双深库位的浅库位时,如果深库位无货,则放入对应的深库位
     */
    public static void toDeepIfEmptyByShallow(String shallowLoc) {