自动化立体仓库 - WMS系统
Junjie
2023-05-12 fd1bfa1163d438ec6cabfdd6e01e632d31189c80
src/main/java/com/zy/common/service/CommonService.java
@@ -59,6 +59,8 @@
    private LocDetlService locDetlService;
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private LocRuleService locRuleService;
    /**
     * 生成工作号
@@ -112,13 +114,132 @@
     * @return locNo 检索到的库位号
     */
    public StartupDto getLocNo(Integer staDescId, Integer sourceStaNo, List<String> matNos, LocTypeDto locTypeDto,int times) {
        StartupDto startupDto = new StartupDto();
        // 目标库位
        LocMast locMast = null;
        //混载找库位
        locMast = getLocNoStep1(matNos, locTypeDto);
        if (locMast != null) {
            //找到库位,返回dto
            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
        }
        //库位规则
        locMast = getLocNoStep2(matNos, locTypeDto);
        if (locMast != null) {
            //找到库位,返回dto
            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
        }
        // 靠近摆放规则 --- 相同订单号, 同天同规格物料
        locMast = getLocNoStep3(staDescId, matNos, locTypeDto);
        if (locMast != null) {
            //找到库位,返回dto
            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
        }
        // 靠近摆放规则 --- 空托
        locMast = getLocNoStep4(staDescId, locTypeDto);
        if (locMast != null) {
            //找到库位,返回dto
            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
        }
        // 如果没有相近物料,则按规则轮询货架
        // 开始查找库位 ==============================>>
        locMast = getLocNoStep5(locTypeDto, times);
        if (locMast != null) {
            //找到库位,返回dto
            return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto
        }
        //找不到库位,抛出异常
        throw new CoolException("没有空库位");
    }
    /**
     * 混载找库位
     */
    private LocMast getLocNoStep1(List<String> matNos, LocTypeDto locTypeDto) {
        LocMast locMast = null;
        //判断当前货物是否为混载货物
        String firstMatNos = matNos.get(0);
        boolean mixed = false;//默认不是混载货物
        for (String matNo : matNos) {
            if (!firstMatNos.equals(matNo)) {
                mixed = true;//混载货物
                break;
            }
        }
        if (!mixed) {
            return locMast;//不是混载货物,直接跳出当前任务
        }
        // 找混载库位规则
        LocRule locRule = locRuleService.findMixed();
        if (locRule == null) {
            return locMast;//没有混载规则,跳出当前任务
        }
        //将库位规则组转换为库位组
        List<LocMast> locMasts = locRuleService.locRuleToLocNos(locRule);
        if (locMasts == null || locMasts.size() == 0) {
            if (locRule.getKeepGo() == 0) {
                //找不到空库位,且禁止继续寻找其他非混载区域库位
                //找不到库位,抛出异常
                throw new CoolException("混载区域没有空库位");
            }
            return locMast;//没有混载规则,跳出当前任务
        }
        for (LocMast one : locMasts) {
            LocMast locMast0 = locMastService.findOutMost(one.getLocNo());
            if (null != locMast0) {
                // 浅库位符合尺寸检测
                if (VersionUtils.locMoveCheckLocType(locMast0, locTypeDto)) {
                    // 因库位移转、需预留空库位
                    if (locMastService.checkEmptyCount(locMast0, 10)) {
                        locMast = locMast0;
                        break;
                    }
                }
            }
        }
        return locMast;
    }
    /**
     * 库位规则
     */
    private LocMast getLocNoStep2(List<String> matNos, LocTypeDto locTypeDto) {
        LocMast locMast = null;
        // 库区锁定
        LocRule locRule = locRuleService.find(Cools.isEmpty(matNos) ? null : matNos.get(0));
        if (!Cools.isEmpty(locRule)) {
            List<LocMast> locMasts = locMastService.queryFreeLocMast2(locTypeDto.getLocType1(), locRule.getRowBeg(), locRule.getRowEnd(), locRule.getBayBeg(), locRule.getBayEnd(), locRule.getLevBeg(), locRule.getLevEnd());
            for (LocMast one : locMasts) {
                LocMast locMast0 = locMastService.findOutMost(one.getLocNo());
                if (null != locMast0) {
                    // 浅库位符合尺寸检测
                    if (VersionUtils.locMoveCheckLocType(locMast0, locTypeDto)) {
                        // 因库位移转、需预留空库位
                        if (locMastService.checkEmptyCount(locMast0, 10)) {
                            locMast = locMast0;
                            break;
                        }
                    }
                }
            }
        }
        return locMast;
    }
    // 靠近摆放规则 --- 相同订单号, 同天同规格物料
    private LocMast getLocNoStep3(Integer staDescId, List<String> matNos, LocTypeDto locTypeDto) {
        LocMast locMast = null;
        if (!Cools.isEmpty(matNos) && matNos.size() == 1 && staDescId == 1) {
            //先判断工作档,查找主档IOType=1, wrkSts < 10的工作明细,料号相同的明细库位
            List<WrkMast> wrkMasts = wrkMastService.selectSameMatnrs(matNos.get(0));
@@ -128,7 +249,6 @@
                    // 浅库位符合尺寸检测
                    if (VersionUtils.locMoveCheckLocType(locMast0, locTypeDto)) {
                        locMast = locMast0;
                        break;
                    }
                }
            }
@@ -148,7 +268,12 @@
            }
        }
        return locMast;
    }
    // 靠近摆放规则 --- 空托
    private LocMast getLocNoStep4(Integer staDescId, LocTypeDto locTypeDto) {
        LocMast locMast = null;
        // 靠近摆放规则 --- 空托
        if (staDescId == 10) {
            //先判断工作档,查找主档IOType=1, wrkSts < 10的工作明细,料号相同的明细库位
@@ -174,15 +299,45 @@
                            if (VersionUtils.locMoveCheckLocType(locMast0, locTypeDto)) {
                                locMast = locMast0;
                                break;
                            }
                        }
                    }
                }
            }
        }
                            }
                        }
                    }
                }
            }
        return locMast;
        }
        // 如果没有相近物料,则按规则轮询货架
    private LocMast getLocNoStep5(LocTypeDto locTypeDto, int times) {
        LocMast locMast = null;
        // 1.当检索库排为浅库位排时,优先寻找当前库排的深库位排
        List<LocMast> peakLocs = locMastService.selectAllPeakLoc();
        for (LocMast peakLoc : peakLocs) {
            List<String> groupInsideLoc = Utils.getGroupInsideLoc(peakLoc.getLocNo());
            if (!Cools.isEmpty(groupInsideLoc)) {
                if (!locMastService.checkAllLocEmpty(groupInsideLoc)) continue;
                locMast = peakLoc;
                break;
            } else {
                locMast = peakLoc;
                break;
            }
        }
        // 2.库位当前所属尺寸无空库位时,调整尺寸参数,向上兼容检索库位
        if (Cools.isEmpty(locMast)) {
            log.error("系统没有空库位!!! 尺寸规格: {}, 轮询次数:{}", JSON.toJSONString(locTypeDto), times);
        }
        return locMast;
    }
    //返回dto
    private StartupDto getLocNoStep6(Integer staDescId, Integer sourceStaNo, LocMast locMast) {
        StartupDto startupDto = new StartupDto();
        // 获取目标站
        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                .eq("type_no", staDescId)
@@ -199,38 +354,13 @@
            throw new CoolException("目标站" + staDesc.getCrnStn() + "不可用");
        }
        // 开始查找库位 ==============================>>
        // 1.当检索库排为浅库位排时,优先寻找当前库排的深库位排
        if (locMast == null) {
            List<LocMast> peakLocs = locMastService.selectAllPeakLoc();
            for (LocMast peakLoc : peakLocs) {
                List<String> groupInsideLoc = Utils.getGroupInsideLoc(peakLoc.getLocNo());
                if (!Cools.isEmpty(groupInsideLoc)){
                    if (!locMastService.checkAllLocEmpty(groupInsideLoc)) continue;
                    locMast = peakLoc;
                    break;
                }else {
                    locMast=peakLoc;
                    break;
                }
            }
        }
        // 2.库位当前所属尺寸无空库位时,调整尺寸参数,向上兼容检索库位
        if (Cools.isEmpty(locMast)) {
            log.error("系统没有空库位!!! 尺寸规格: {}, 轮询次数:{}", JSON.toJSONString(locTypeDto), times);
            throw new CoolException("没有空库位");
        }
        String locNo = locMast.getLocNo();
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        startupDto.setWorkNo(workNo);
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setStaNo(staNo.getDevNo());
        startupDto.setLocNo(locNo);
        startupDto.setLocNo(locMast.getLocNo());
        return startupDto;
    }