|  |  |  | 
|---|
|  |  |  | import java.time.temporal.ChronoUnit; | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  | import java.util.List; | 
|---|
|  |  |  | import java.util.Optional; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 货架核心功能 | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private Optional<CrnRowInfo> findAvailableCrnAndNearRow(RowLastno rowLastno, int curRow, int crnNumber, int times, | 
|---|
|  |  |  | FindLocNoAttributeVo findLocNoAttributeVo, LocTypeDto locTypeDto, | 
|---|
|  |  |  | RowLastnoType rowLastnoType) { | 
|---|
|  |  |  | int attempt = times; | 
|---|
|  |  |  | while (attempt < crnNumber * 4) { | 
|---|
|  |  |  | int[] params = Utils.LocNecessaryParameters(rowLastno, curRow, crnNumber); | 
|---|
|  |  |  | curRow = params[1]; | 
|---|
|  |  |  | int crnNo = params[2]; | 
|---|
|  |  |  | if (!basCrnpService.checkSiteError(crnNo, true)) { | 
|---|
|  |  |  | attempt++; | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | int rowCount = params[0]; | 
|---|
|  |  |  | int nearRow = params[3]; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 只取数量判断,避免拉整 list | 
|---|
|  |  |  | int availableLocCount = locMastService.selectCount(new EntityWrapper<LocMast>() | 
|---|
|  |  |  | .eq("row1", nearRow) | 
|---|
|  |  |  | .eq("loc_sts", "O") | 
|---|
|  |  |  | .eq("whs_type", rowLastnoType.getType().longValue())); | 
|---|
|  |  |  | int crnCountO = wrkMastService.selectCount(new EntityWrapper<WrkMast>() | 
|---|
|  |  |  | .eq("crn_no", crnNo).le("io_type", 100)); | 
|---|
|  |  |  | if (availableLocCount - crnCountO <= 2) { // 可以提成常量,比如 MIN_SPARE_SLOTS = 2 | 
|---|
|  |  |  | log.error("{}号堆垛机没有空库位!!! 尺寸规格: {}, 轮询次数:{}", crnNo, JSON.toJSONString(locTypeDto), attempt); | 
|---|
|  |  |  | attempt++; | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return Optional.of(new CrnRowInfo(crnNo, nearRow, curRow, rowCount, attempt)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return Optional.empty(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 检索库位号 | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //此程序用于优化堆垛机异常时的运行时间 | 
|---|
|  |  |  | for (int i = times; i < crnNumber * 2; i++) { | 
|---|
|  |  |  | int[] locNecessaryParameters = Utils.LocNecessaryParameters(rowLastno, curRow, crnNumber); | 
|---|
|  |  |  | curRow = locNecessaryParameters[1]; | 
|---|
|  |  |  | crnNo = locNecessaryParameters[2]; | 
|---|
|  |  |  | if (basCrnpService.checkSiteError(crnNo, true)) { | 
|---|
|  |  |  | rowCount = locNecessaryParameters[0]; | 
|---|
|  |  |  | nearRow = locNecessaryParameters[3]; | 
|---|
|  |  |  | List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>() | 
|---|
|  |  |  | .eq("row1", nearRow).eq("loc_sts", "O").eq("whs_type", rowLastnoType.getType().longValue())); | 
|---|
|  |  |  | int crnCountO = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("crn_no", crnNo).le("io_type", 100)); | 
|---|
|  |  |  | if (locMasts.size() - crnCountO <= 2) { | 
|---|
|  |  |  | log.error(crnNo + "号堆垛机没有空库位!!! 尺寸规格: {}, 轮询次数:{}", JSON.toJSONString(locTypeDto), times); | 
|---|
|  |  |  | nearRow = 0; | 
|---|
|  |  |  | times++; | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | times++; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (nearRow == 0) { | 
|---|
|  |  |  | Optional<CrnRowInfo> infoOpt = findAvailableCrnAndNearRow(rowLastno, curRow, crnNumber, times, findLocNoAttributeVo, locTypeDto, rowLastnoType); | 
|---|
|  |  |  | if (!infoOpt.isPresent()) { | 
|---|
|  |  |  | throw new CoolException("无可用堆垛机"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | CrnRowInfo info = infoOpt.get(); | 
|---|
|  |  |  | crnNo = info.getCrnNo(); | 
|---|
|  |  |  | nearRow = info.getNearRow(); | 
|---|
|  |  |  | curRow = info.getCurRow(); | 
|---|
|  |  |  | rowCount = info.getRowCount(); | 
|---|
|  |  |  | times = info.getTimes(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | boolean signRule1 = false; | 
|---|
|  |  |  | boolean signRule2 = false; | 
|---|
|  |  |  | 
|---|
|  |  |  | List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>() | 
|---|
|  |  |  | .eq("row1", nearRow) | 
|---|
|  |  |  | .eq("loc_sts", "O").eq("whs_type", rowLastnoType.getType().longValue()) | 
|---|
|  |  |  | .orderBy("lev1", false).orderBy("bay1", true)); | 
|---|
|  |  |  | .orderBy("lev1", true).orderBy("bay1", false)); | 
|---|
|  |  |  | for (LocMast locMast1 : locMasts) { | 
|---|
|  |  |  | if (!VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | 
|---|
|  |  |  | List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>() | 
|---|
|  |  |  | .eq("row1", nearRow) | 
|---|
|  |  |  | .eq("loc_sts", "O").eq("whs_type", rowLastnoType.getType().longValue()) | 
|---|
|  |  |  | .orderBy("lev1", true).orderBy("bay1", true)); | 
|---|
|  |  |  | .orderBy("lev1", true).orderBy("bay1", false)); | 
|---|
|  |  |  | for (LocMast locMast1 : locMasts) { | 
|---|
|  |  |  | if (!VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) { | 
|---|
|  |  |  | continue; | 
|---|