| | |
| | | return (float) Arith.multiplys(2, f, 1); |
| | | } |
| | | |
| | | public static int armStaNo(int armNo,int staNo) { |
| | | switch (armNo){ |
| | | public static int armStaNo(int armNo, int staNo) { |
| | | switch (armNo) { |
| | | case 1: |
| | | switch (staNo){ |
| | | switch (staNo) { |
| | | case 0: |
| | | return 7; |
| | | case 1: |
| | |
| | | return 0; |
| | | } |
| | | case 2: |
| | | switch (staNo){ |
| | | switch (staNo) { |
| | | case 0: |
| | | return 5; |
| | | case 1: |
| | |
| | | return 0; |
| | | } |
| | | case 3: |
| | | switch (staNo){ |
| | | switch (staNo) { |
| | | case 0: |
| | | return 3; |
| | | case 1: |
| | |
| | | return 0; |
| | | } |
| | | case 4: |
| | | switch (staNo){ |
| | | switch (staNo) { |
| | | case 0: |
| | | return 1; |
| | | case 1: |
| | |
| | | return 0; |
| | | } |
| | | case 5: |
| | | switch (staNo){ |
| | | switch (staNo) { |
| | | case 0: |
| | | return 11; |
| | | case 1: |
| | |
| | | return 0; |
| | | } |
| | | case 6: |
| | | switch (staNo){ |
| | | switch (staNo) { |
| | | case 0: |
| | | return 13; |
| | | case 1: |
| | |
| | | * <p>处理规则: |
| | | * 1. 先根据入库站点查询所属库区。 |
| | | * 2. 先提取该库区内的堆垛机,并按可用空库位过滤不可用堆垛机。 |
| | | * 3. 若当前库区没有满足条件的空库位,再补充其他库区的堆垛机。 |
| | | * 4. 当 {@code locType1 = 1} 时,先返回低库位堆垛机,再把同批堆垛机的高库位追加到后面。 |
| | | * 5. 对不存在、故障、不可入以及无空库位的堆垛机直接剔除。 |
| | | * 6. 当物料为 {@code emptyPallet} 时,按空板入库优先规则重新排序。 |
| | | * 3. 当 {@code locType1 = 1} 时,先返回低库位堆垛机,再把同批堆垛机的高库位追加到后面。 |
| | | * 4. 对不存在、故障、不可入以及无空库位的堆垛机直接剔除。 |
| | | * |
| | | * <p>这里是只读排序工具,不再写回 {@code asr_row_lastno.crn_qty}。 |
| | | * {@code crn_qty} 在主数据里表示“堆垛机数量”,不能再被拿来当轮询游标,否则会把整仓配置写坏。 |
| | | * |
| | | * <p>返回结果中的每一项格式为: |
| | | * {@code {crnNo: 堆垛机号, locType1: 库位高低类型}} |
| | | * |
| | | * @param stationId 入库站点 |
| | | * @param locType1 目标库位高低类型,1=低库位,2=高库位 |
| | | * @param matnr 物料编码,传入 {@code emptyPallet} 时使用空板排序规则 |
| | | * @param locType1 目标库位高低类型,1=低库位,2=高库位 |
| | | * @param matnr 物料编码,传入 {@code emptyPallet} 时使用空板排序规则 |
| | | * @return 按优先级排好序的堆垛机列表 |
| | | */ |
| | | public static List<Map<String, Integer>> getStationStorageAreaName(Integer stationId, Integer locType1, String matnr) { |
| | |
| | | // 先取当前库区对应的堆垛机。 |
| | | List<Integer> preferredCrnNos = getAreaCrnNos(storageArea, rowLastno); |
| | | List<Integer> preferredAvailableCrnNos = getAvailableCrnNos(preferredCrnNos, locType1, emptyPallet, basCrnpService, locMastService); |
| | | appendCrnLocTypeEntries(result, preferredAvailableCrnNos, locType1, locMastService); |
| | | appendCrnLocTypeEntries(result, preferredAvailableCrnNos, locType1, emptyPallet, locMastService); |
| | | |
| | | // 当前库区没有可用容量时,再补充其他库区堆垛机。 |
| | | if (!hasAvailableCapacity(preferredCrnNos, locType1, basCrnpService, locMastService)) { |
| | | List<Integer> otherAreaCrnNos = getOtherAreaCrnNos(storageArea, rowLastno); |
| | | List<Integer> otherAvailableCrnNos = getAvailableCrnNos(otherAreaCrnNos, locType1, emptyPallet, basCrnpService, locMastService); |
| | | appendCrnLocTypeEntries(result, otherAvailableCrnNos, locType1, locMastService); |
| | | } |
| | | return result; |
| | | } |
| | | private static void appendCrnLocTypeEntries(List<Map<String, Integer>> result, List<Integer> crnNos, Integer locType1, LocMastService locMastService) { |
| | | |
| | | private static void appendCrnLocTypeEntries(List<Map<String, Integer>> result, List<Integer> crnNos, Integer locType1, boolean emptyPallet, LocMastService locMastService) { |
| | | Short normalizedLocType1 = normalizeLocType1(locType1); |
| | | if (normalizedLocType1 == null) { |
| | | appendCrnLocTypeEntries(result, crnNos, (short) 1, locMastService); |
| | | appendCrnLocTypeEntries(result, crnNos, (short) 2, locMastService); |
| | | appendCrnLocTypeEntries(result, crnNos, (short) 1, emptyPallet, locMastService); |
| | | appendCrnLocTypeEntries(result, crnNos, (short) 2, emptyPallet, locMastService); |
| | | return; |
| | | } |
| | | appendCrnLocTypeEntries(result, crnNos, normalizedLocType1, locMastService); |
| | | appendCrnLocTypeEntries(result, crnNos, normalizedLocType1, emptyPallet, locMastService); |
| | | if (normalizedLocType1 == 1) { |
| | | appendCrnLocTypeEntries(result, crnNos, (short) 2, locMastService); |
| | | appendCrnLocTypeEntries(result, crnNos, (short) 2, emptyPallet, locMastService); |
| | | } |
| | | } |
| | | |
| | | private static void appendCrnLocTypeEntries(List<Map<String, Integer>> result, List<Integer> crnNos, Short targetLocType1, LocMastService locMastService) { |
| | | private static void appendCrnLocTypeEntries(List<Map<String, Integer>> result, List<Integer> crnNos, Short targetLocType1, boolean emptyPallet, LocMastService locMastService) { |
| | | if (targetLocType1 == null || Cools.isEmpty(crnNos)) { |
| | | return; |
| | | } |
| | | for (Integer crnNo : crnNos) { |
| | | if (!hasAvailableLoc(crnNo, targetLocType1, locMastService) || containsCrnLocType(result, crnNo, targetLocType1)) { |
| | | if (!hasAvailableLoc(crnNo, targetLocType1, emptyPallet, locMastService) || containsCrnLocType(result, crnNo, targetLocType1)) { |
| | | continue; |
| | | } |
| | | Map<String, Integer> item = new LinkedHashMap<>(); |
| | |
| | | } |
| | | |
| | | private static List<Integer> getAvailableCrnNos(List<Integer> candidateCrnNos, Integer locType1, boolean emptyPallet, |
| | | BasCrnpService basCrnpService, LocMastService locMastService) { |
| | | BasCrnpService basCrnpService, LocMastService locMastService) { |
| | | LinkedHashSet<Integer> availableCrnNos = new LinkedHashSet<>(); |
| | | if (Cools.isEmpty(candidateCrnNos)) { |
| | | return new ArrayList<>(); |
| | |
| | | if (crnNo == null || !basCrnpService.checkSiteError(crnNo, true)) { |
| | | continue; |
| | | } |
| | | if (!hasAvailableLocForRequest(crnNo, locType1, locMastService)) { |
| | | if (!hasAvailableLocForRequest(crnNo, locType1, emptyPallet, locMastService)) { |
| | | continue; |
| | | } |
| | | availableCrnNos.add(crnNo); |
| | |
| | | return "Y".equalsIgnoreCase(basCrnp.getEmpIn()) ? 1 : 0; |
| | | } |
| | | |
| | | private static boolean hasAvailableLocForRequest(Integer crnNo, Integer locType1, LocMastService locMastService) { |
| | | private static boolean hasAvailableLocForRequest(Integer crnNo, Integer locType1, boolean emptyPallet, LocMastService locMastService) { |
| | | Short normalizedLocType1 = normalizeLocType1(locType1); |
| | | if (normalizedLocType1 == null) { |
| | | return hasAvailableLoc(crnNo, (short) 1, locMastService) || hasAvailableLoc(crnNo, (short) 2, locMastService); |
| | | return hasAvailableLoc(crnNo, (short) 1, emptyPallet, locMastService) |
| | | || hasAvailableLoc(crnNo, (short) 2, emptyPallet, locMastService); |
| | | } |
| | | if (hasAvailableLoc(crnNo, normalizedLocType1, locMastService)) { |
| | | if (hasAvailableLoc(crnNo, normalizedLocType1, emptyPallet, locMastService)) { |
| | | return true; |
| | | } |
| | | return normalizedLocType1 == 1 && hasAvailableLoc(crnNo, (short) 2, locMastService); |
| | | return normalizedLocType1 == 1 && hasAvailableLoc(crnNo, (short) 2, emptyPallet, locMastService); |
| | | } |
| | | |
| | | private static boolean hasAvailableLoc(Integer crnNo, Short locType1, LocMastService locMastService) { |
| | | private static boolean hasAvailableLoc(Integer crnNo, Short locType1, boolean emptyPallet, LocMastService locMastService) { |
| | | if (crnNo == null || locType1 == null) { |
| | | return false; |
| | | } |
| | | return locMastService.selectCount(new EntityWrapper<LocMast>() |
| | | .eq("crn_no", crnNo) |
| | | .eq("loc_sts", "O") |
| | | .eq("loc_type1", locType1)) > 0; |
| | | EntityWrapper<LocMast> wrapper = new EntityWrapper<LocMast>(); |
| | | wrapper.eq("crn_no", crnNo); |
| | | wrapper.eq("loc_sts", "O"); |
| | | wrapper.eq("loc_type1", locType1); |
| | | if (!emptyPallet) { |
| | | wrapper.ne("loc_type2", 1); |
| | | } |
| | | return locMastService.selectCount(wrapper) > 0; |
| | | } |
| | | |
| | | private static Short normalizeLocType1(Integer locType1) { |
| | | if (locType1 == null || (locType1 != 1 && locType1 != 2)) { |
| | | return null; |
| | | } else { |
| | | locType1 = 2; |
| | | } |
| | | return locType1.shortValue(); |
| | | } |
| | |
| | | if (areaRowLastno == null) { |
| | | return new ArrayList<>(crnNos); |
| | | } |
| | | Integer startCrnNo = resolveAreaStartCrnNo(areaRowLastno, rowLastno); |
| | | Integer endCrnNo = resolveAreaEndCrnNo(areaRowLastno, rowLastno); |
| | | if (startCrnNo != null && endCrnNo != null && startCrnNo <= endCrnNo) { |
| | | for (int crnNo = startCrnNo; crnNo <= endCrnNo; crnNo++) { |
| | | addAreaCrnNo(crnNos, crnNo, 1, endCrnNo); |
| | | } |
| | | for (int crnNo = areaRowLastno.getsCrnNo(); crnNo <= startCrnNo; crnNo++) { |
| | | addAreaCrnNo(crnNos, crnNo, 1, endCrnNo); |
| | | } |
| | | Integer nextCrnQty = startCrnNo + 1; |
| | | if (areaRowLastno.geteCrnNo() != null && nextCrnQty > areaRowLastno.geteCrnNo()) { |
| | | nextCrnQty = areaRowLastno.getsCrnNo() == null ? 1 : areaRowLastno.getsCrnNo(); |
| | | } |
| | | areaRowLastno.setCrnQty(nextCrnQty); |
| | | SpringUtils.getBean(RowLastnoService.class).updateById(areaRowLastno); |
| | | Integer startCrnNo = resolveAreaStartCrnNo(areaRowLastno); |
| | | List<Integer> orderedCrnNos = getOrderedCrnNos(areaRowLastno, startCrnNo); |
| | | if (!orderedCrnNos.isEmpty()) { |
| | | crnNos.addAll(orderedCrnNos); |
| | | } |
| | | |
| | | if (crnNos.isEmpty()) { |
| | |
| | | return defaultRowLastno; |
| | | } |
| | | RowLastnoService rowLastnoService = SpringUtils.getBean(RowLastnoService.class); |
| | | List<RowLastno> typeMatched = rowLastnoService.selectList(new EntityWrapper<RowLastno>() |
| | | .eq("type_id", area)); |
| | | if (!Cools.isEmpty(typeMatched)) { |
| | | return typeMatched.get(0); |
| | | } |
| | | // List<RowLastno> typeMatched = rowLastnoService.selectList(new EntityWrapper<RowLastno>() |
| | | // .eq("type_id", area)); |
| | | // if (!Cools.isEmpty(typeMatched)) { |
| | | // return typeMatched.get(0); |
| | | // } |
| | | List<RowLastno> whsMatched = rowLastnoService.selectList(new EntityWrapper<RowLastno>() |
| | | .eq("whs_type", area)); |
| | | if (!Cools.isEmpty(whsMatched)) { |
| | |
| | | return defaultRowLastno; |
| | | } |
| | | |
| | | private static Integer resolveAreaStartCrnNo(RowLastno areaRowLastno, RowLastno defaultRowLastno) { |
| | | if (areaRowLastno != null && areaRowLastno.getCrnQty() != null && areaRowLastno.getCrnQty() > 0) { |
| | | return areaRowLastno.getCrnQty(); |
| | | private static Integer resolveAreaStartCrnNo(RowLastno areaRowLastno) { |
| | | if (areaRowLastno == null) { |
| | | return null; |
| | | } |
| | | if (areaRowLastno != null && areaRowLastno.getsCrnNo() != null && areaRowLastno.getsCrnNo() > 0) { |
| | | return areaRowLastno.getsCrnNo(); |
| | | Integer startCrnNo = areaRowLastno.getsCrnNo(); |
| | | Integer endCrnNo = areaRowLastno.geteCrnNo(); |
| | | Integer currentRow = areaRowLastno.getCurrentRow(); |
| | | Integer rowSpan = getCrnRowSpan(areaRowLastno.getTypeId()); |
| | | if (startCrnNo == null || startCrnNo <= 0) { |
| | | return 1; |
| | | } |
| | | if (defaultRowLastno != null && defaultRowLastno.getsCrnNo() != null && defaultRowLastno.getsCrnNo() > 0) { |
| | | return defaultRowLastno.getsCrnNo(); |
| | | if (endCrnNo == null || endCrnNo < startCrnNo || currentRow == null || rowSpan == null || rowSpan <= 0) { |
| | | return startCrnNo; |
| | | } |
| | | return 1; |
| | | int startRow = areaRowLastno.getsRow() == null ? 1 : areaRowLastno.getsRow(); |
| | | int offset = Math.max(currentRow - startRow, 0) / rowSpan; |
| | | int resolvedCrnNo = startCrnNo + offset; |
| | | if (resolvedCrnNo < startCrnNo || resolvedCrnNo > endCrnNo) { |
| | | return startCrnNo; |
| | | } |
| | | return resolvedCrnNo; |
| | | } |
| | | |
| | | private static Integer resolveAreaEndCrnNo(RowLastno areaRowLastno, RowLastno defaultRowLastno) { |
| | | if (areaRowLastno != null && areaRowLastno.geteCrnNo() != null && areaRowLastno.geteCrnNo() > 0) { |
| | | return areaRowLastno.geteCrnNo(); |
| | | private static List<Integer> getOrderedCrnNos(RowLastno rowLastno, Integer startCrnNo) { |
| | | List<Integer> orderedCrnNos = new ArrayList<>(); |
| | | if (rowLastno == null) { |
| | | return orderedCrnNos; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private static void addAreaCrnNo(LinkedHashSet<Integer> crnNos, Integer crnNo, Integer startCrnNo, Integer endCrnNo) { |
| | | if (crnNos == null || crnNo == null || startCrnNo == null || endCrnNo == null) { |
| | | return; |
| | | int start = rowLastno.getsCrnNo() == null ? 1 : rowLastno.getsCrnNo(); |
| | | int end = rowLastno.geteCrnNo() == null ? start + ((rowLastno.getCrnQty() == null ? 1 : rowLastno.getCrnQty()) - 1) : rowLastno.geteCrnNo(); |
| | | int first = startCrnNo == null ? start : startCrnNo; |
| | | if (first < start || first > end) { |
| | | first = start; |
| | | } |
| | | if (crnNo < startCrnNo || crnNo > endCrnNo) { |
| | | return; |
| | | for (int crnNo = first; crnNo <= end; crnNo++) { |
| | | orderedCrnNos.add(crnNo); |
| | | } |
| | | crnNos.add(crnNo); |
| | | for (int crnNo = start; crnNo < first; crnNo++) { |
| | | orderedCrnNos.add(crnNo); |
| | | } |
| | | return orderedCrnNos; |
| | | } |
| | | |
| | | private static List<Integer> getAllCrnNos(RowLastno rowLastno) { |
| | |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | private static Integer parseStorageArea(String area) { |
| | | if (Cools.isEmpty(area)) { |
| | | return null; |
| | |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | public static String zerofill(String msg, Integer count) { |
| | | if (msg.length() == count) { |
| | | return msg; |
| | |
| | | */ |
| | | public static String getDeepLoc(SlaveProperties slaveProperties, String shallowLoc) { |
| | | int row = getRow(shallowLoc); |
| | | boolean deepLocLeft = isDeepLocLeft(slaveProperties, row-1); |
| | | boolean deepLocRight = isDeepLocRight(slaveProperties, row+1); |
| | | boolean deepLocLeft = isDeepLocLeft(slaveProperties, row - 1); |
| | | boolean deepLocRight = isDeepLocRight(slaveProperties, row + 1); |
| | | int targetRow; |
| | | if (deepLocLeft) { |
| | | targetRow = row - 1; |
| | |
| | | * 获取 浅库位排对应的深库位排 |
| | | */ |
| | | public static Integer getDeepRow(SlaveProperties slaveProperties, Integer shallowRow) { |
| | | boolean deepLocLeft = isDeepLocLeft(slaveProperties, shallowRow-1); |
| | | boolean deepLocRight = isDeepLocRight(slaveProperties, shallowRow+1); |
| | | boolean deepLocLeft = isDeepLocLeft(slaveProperties, shallowRow - 1); |
| | | boolean deepLocRight = isDeepLocRight(slaveProperties, shallowRow + 1); |
| | | int targetRow; |
| | | if (deepLocLeft) { |
| | | targetRow = shallowRow - 1; |
| | |
| | | if (curRow < sRow || curRow > (crnNumber * 4 + sRow - 1)) { |
| | | throw new CoolException("库位排号异常:排号:" + curRow); |
| | | } |
| | | if ((curRow - (sRow-1)) % 4 == 0) { |
| | | if ((curRow - (sRow - 1)) % 4 == 0) { |
| | | necessaryParameters[1] = curRow; //curRow 最深库位排 |
| | | necessaryParameters[2] = (curRow - (sRow-1)) / 4 + sCrnNo - 1; //crnNo 堆垛机号 |
| | | necessaryParameters[2] = (curRow - (sRow - 1)) / 4 + sCrnNo - 1; //crnNo 堆垛机号 |
| | | necessaryParameters[3] = curRow - 1; //nearRow 最浅库位排 |
| | | } else if ((curRow - (sRow-1)-1) % 4 == 0) { |
| | | } else if ((curRow - (sRow - 1) - 1) % 4 == 0) { |
| | | necessaryParameters[1] = curRow; //curRow 最深库位排 |
| | | necessaryParameters[2] = (curRow - (sRow-1)-1) / 4 + sCrnNo; //crnNo 堆垛机号 |
| | | necessaryParameters[2] = (curRow - (sRow - 1) - 1) / 4 + sCrnNo; //crnNo 堆垛机号 |
| | | necessaryParameters[3] = curRow + 1; //nearRow 最浅库位排 |
| | | } else { |
| | | throw new CoolException("库位排号异常:排号:" + curRow); |
| | |
| | | |
| | | return necessaryParameters; |
| | | } |
| | | |
| | | //四向库(牛眼\光泰) |
| | | public static int[] LocNecessaryParametersDoubleExtension6(RowLastno rowLastno, Integer curRow, Integer crnNumber) { |
| | | int[] necessaryParameters = new int[]{0, 0, 0, 0}; |
| | |
| | | necessaryParameters[0] = crnNumber; // 轮询次数 |
| | | curRow = curRow - offset; |
| | | //满板正常入库 |
| | | switch (curRow){ |
| | | switch (curRow) { |
| | | case 1: |
| | | necessaryParameters[1] = 4; //curRow 最深库位排 |
| | | necessaryParameters[2] = sCrnNo; //crnNo 堆垛机号 |
| | |
| | | Integer sCrnNo = rowLastno.getsCrnNo();//起始堆垛机号 |
| | | necessaryParameters[0] = crnNumber; // 轮询次数 |
| | | //满板正常入库 |
| | | if (curRow.equals(rowLastno.geteRow())){ |
| | | if (curRow.equals(rowLastno.geteRow())) { |
| | | necessaryParameters[1] = sRow; //curRow 最深库位排 |
| | | necessaryParameters[2] = sCrnNo; //crnNo 堆垛机号 |
| | | necessaryParameters[3] = sRow; //nearRow 最浅库位排 |
| | |
| | | // 外侧方向的货位 优先入库方向 ===>> 反之 |
| | | public static List<String> getGroupOutLocCrn(Integer curRow, Integer nearRow, String locNo, boolean pakin) { |
| | | List<String> result = new ArrayList<>(); |
| | | if (pakin){ |
| | | for (int row = curRow;row>=nearRow;row--){ |
| | | if (pakin) { |
| | | for (int row = curRow; row >= nearRow; row--) { |
| | | result.add(zerofill(String.valueOf(row), 2) + locNo.substring(2)); |
| | | } |
| | | }else { |
| | | for (int row = curRow;row<=nearRow;row++){ |
| | | } else { |
| | | for (int row = curRow; row <= nearRow; row++) { |
| | | result.add(zerofill(String.valueOf(row), 2) + locNo.substring(2)); |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | //erp庫位轉換 |
| | | public static String ERPLocToWMSLoc(String locNo) { |
| | | String WmsLoc = locNo.substring(1); |
| | | String[] split = locNo.split("-"); |
| | | WmsLoc = split[0].substring(1) + split[1] + split[2]; |
| | | |
| | | return WmsLoc; |
| | | } |
| | | |
| | | //将wms库位号转换成wcs库位号 |
| | |
| | | for (char c : row.toCharArray()) { |
| | | if (c == '0') { |
| | | i++; |
| | | }else { |
| | | } else { |
| | | break; |
| | | } |
| | | } |
| | |
| | | for (char c : boy.toCharArray()) { |
| | | if (c == '0') { |
| | | j++; |
| | | }else { |
| | | } else { |
| | | break; |
| | | } |
| | | } |
| | |
| | | for (char c : lev.toCharArray()) { |
| | | if (c == '0') { |
| | | k++; |
| | | }else { |
| | | } else { |
| | | break; |
| | | } |
| | | } |
| | | lev = lev.substring(k); |
| | | return row + "-" + boy + "-" + lev; |
| | | } |
| | | |
| | | } |
| | | |
| | | |