自动化立体仓库 - WMS系统
#1
czkh
1 天以前 8fbd60d7e7fc0e35b3bff5a0c63e2d1bd80be8cf
#1
2个文件已修改
250 ■■■■■ 已修改文件
src/main/java/com/zy/common/service/CommonService.java 248 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java
@@ -316,13 +316,24 @@
        // 1.按规则查找库位
        if (Cools.isEmpty(locMast) && crnNo != 0) {
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow).eq("loc_sts", "O").eq("loc_type1",locTypeDto.getLocType1()));
            if (Cools.isEmpty(locMasts)){
                // 当前巷道无空库位时,递归调整至下一巷道,检索全部巷道无果后,跳出递归
                if (times < rowCount) {
                    times = times + 1;
                    return getLocNo(1, staDescId, sourceStaNo, matnr, batch, grade, moveCrnNo, locTypeDto, times);
            List<LocMast> locMasts = new ArrayList<>();
            locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow)
                    .eq("loc_sts", "O")
                    .eq("loc_type1",locTypeDto.getLocType1()));
            if (Cools.isEmpty(locMasts) || locMasts.size() <= 5){
                if (nearRow == 2){
                    locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow + 1)
                            .eq("loc_sts", "O")
                            .eq("loc_type1",locTypeDto.getLocType1()));
                }else if (nearRow == 3){
                    locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow - 1)
                            .eq("loc_sts", "O")
                            .eq("loc_type1",locTypeDto.getLocType1()));
                }
            }
            if (locMasts.size() <= 5){
                throw new CoolException("无空库位可用");
            }
            List<LocMast> locMastList = new ArrayList<>();
            locMasts.sort(new Comparator<LocMast>() {
@@ -399,4 +410,229 @@
        startupDto.setLocNo(locNo);
        return startupDto;
    }
    @Transactional
    public StartupDto getLocNoEmpty(Integer whsType, Integer staDescId, Integer sourceStaNo, String matnr, String batch, String grade, LocTypeDto locTypeDto) {
        whsType = Utils.GetWhsType(sourceStaNo);
        return getLocNoEmpty(whsType, staDescId, sourceStaNo, matnr, batch, grade, 0, locTypeDto, 0);
    }
    @Transactional
    public StartupDto getLocNoEmpty(Integer whsType, Integer staDescId, Integer sourceStaNo, String matnr, String batch, String grade, Integer moveCrnNo, LocTypeDto locTypeDto, int times) {
        if (Cools.isEmpty(matnr)) {  //物料号
            matnr = "";
        }
        if (Cools.isEmpty(batch)) {  //箱号
            batch = "";
        }
        if (Cools.isEmpty(grade)) {  //备用
            grade = "";
        }
        // 初始化参数
        int crnNo = 0;      //堆垛机号
        int nearRow = 0;    //最浅库位排
        int curRow = 0;     //最深库位排
        int rowCount = 0;   //轮询轮次
        LocMast locMast = null;     // 目标库位
        StartupDto startupDto = new StartupDto();
        RowLastno rowLastno = rowLastnoService.selectById(whsType);
        int sRow = rowLastno.getsRow();
        int eRow = rowLastno.geteRow();
        int crnNumber = rowLastno.getCrnQty();
        if (Cools.isEmpty(rowLastno)) {
            throw new CoolException("数据异常,请联系管理员");
        }
        // ===============>>>> 开始执行
        curRow = rowLastno.getCurrentRow();
        if (!Cools.isEmpty(moveCrnNo) && moveCrnNo != 0) {
            crnNumber = moveCrnNo;
            if (times == 0) {
                curRow = moveCrnNo * 4 - 1;
            } else {
                curRow = moveCrnNo * 4 - 2;
            }
        }
        //此程序用于优化堆垛机异常时的运行时间
        for (int i = times; i < crnNumber; i++) {
            int[] locNecessaryParameters = Utils.LocNecessaryParameters(whsType, curRow, crnNumber);
            curRow = locNecessaryParameters[1];
            crnNo = locNecessaryParameters[2];
            if (basCrnpService.checkSiteError(crnNo, true)) {
                rowCount = locNecessaryParameters[0];
                nearRow = locNecessaryParameters[3];
                break;
            } else {
                times++;
            }
        }
        if (nearRow == 0) {
            throw new CoolException("无可用堆垛机");
        }
        boolean signRule1 = false;
        boolean signRule2 = false;
        Wrapper<StaDesc> wrapper = null;
        StaDesc staDesc = null;
        BasDevp staNo = null;
        if (Utils.BooleanWhsTypeSta(whsType, staDescId)) {
            // 获取目标站
            wrapper = new EntityWrapper<StaDesc>()
                    .eq("type_no", staDescId)
                    .eq("stn_no", sourceStaNo)
                    .eq("crn_no", crnNo);
            staDesc = staDescService.selectOne(wrapper);
            if (Cools.isEmpty(staDesc)) {
                log.error("type_no={},stn_no={},crn_no={}", staDescId, sourceStaNo, crnNo);
//                throw new CoolException("入库路径不存在");
                crnNo = 0;
            }
            staNo = basDevpService.selectById(staDesc.getCrnStn());
            if (!staNo.getAutoing().equals("Y")) {
//                throw new CoolException("目标站"+staDesc.getCrnStn()+"不可用");
                crnNo = 0;
            }
            startupDto.setStaNo(staNo.getDevNo());
        }
        // 更新库位排号
        if (Utils.BooleanWhsTypeSta(whsType, staDescId)) {
            rowLastno.setCurrentRow(curRow);
            rowLastnoService.updateById(rowLastno);
        }
        // 开始查找库位 ==============================>>
        // 1.按规则查找库位
        if (Cools.isEmpty(locMast) && crnNo != 0) {
            List<LocMast> locMasts = new ArrayList<>();
            List<LocMast> locMastsLow2 = new ArrayList<>();
            List<LocMast> locMastsLow3 = new ArrayList<>();
            locMastsLow2 = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", 2)
                    .eq("loc_sts", "O").eq("loc_type1",locTypeDto.getLocType1()));
            locMastsLow3 = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", 3)
                    .eq("loc_sts", "O").eq("loc_type1",locTypeDto.getLocType1()));
            if (locMastsLow2.size() <= 5 && locMastsLow3.size() <= 5){
                locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow)
                        .eq("loc_sts", "O").ge("lev1",8));
                if (Cools.isEmpty(locMasts)){
                    if (nearRow == 2){
                        locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow + 1)
                                .eq("loc_sts", "O").ge("lev1",8));
                    }else if (nearRow == 3){
                        locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow - 1)
                                .eq("loc_sts", "O").ge("lev1",8));
                    }
                }
            }else {
                locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow)
                        .eq("loc_sts", "O"));
                if (Cools.isEmpty(locMasts)){
                    if (nearRow == 2){
                        locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow + 1)
                                .eq("loc_sts", "O"));
                    }else if (nearRow == 3){
                        locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow - 1)
                                .eq("loc_sts", "O"));
                    }
                }
            }
//            locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow)
//                    .eq("loc_sts", "O").eq("loc_type1",locTypeDto.getLocType1()));
//            if (Cools.isEmpty(locMasts) || locMasts.size() <= 5){
//                if (nearRow == 2){
//                    locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow + 1)
//                            .eq("loc_sts", "O"));
//                }else if (nearRow == 3){
//                    locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow - 1)
//                            .eq("loc_sts", "O"));
//
//                }
//            }
            if (locMasts.size() <= 5){
                throw new CoolException("无空库位可用");
            }
            List<LocMast> locMastList = new ArrayList<>();
            locMasts.sort(new Comparator<LocMast>() {
                @Override
                public int compare(LocMast o1, LocMast o2) {
                    int b1 = o1.getBay1();
                    int b2 = o2.getBay1();
                    if (o1.getBay1() >= 15) {
                        b1 = Math.abs(15 - o1.getBay1());
                    }
                    if (o2.getBay1() >= 15) {
                        b2 = Math.abs(15 - o2.getBay1());
                    }
                    return b2 - b1;
                }
            });
            for (LocMast locMast1 : locMasts) {
//                if (!VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) {
//                    continue;
//                }
                String shallowLoc = Utils.getDeepLoc(slaveProperties, locMast1.getLocNo());
                LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", shallowLoc));
                if (Cools.isEmpty(locMast2)){
                    continue;
                }
                if (locMast2.getLocSts().equals("P")||locMast2.getLocSts().equals("Q")||locMast2.getLocSts().equals("R")||locMast2.getLocSts().equals("S")){
                    continue;
                }
                if (!Cools.isEmpty(locMast2)&&locMast2.getLocSts().equals("O")){
                    locMast = locMast2;
                    break;
                }
                if (!Cools.isEmpty(locMast2)&&(locMast2.getLocSts().equals("F")||locMast2.getLocSts().equals("D"))){
                    locMast = locMast1;
                    break;
                }
//                LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", shallowLoc).eq("loc_sts", "O"));
//                if (Cools.isEmpty(locMast2)) {
//                    locMast = locMast1;
//                    break;
//                }
            }
        }
        if (!Cools.isEmpty(locMast) && !basCrnpService.checkSiteError(crnNo, true)) {
            locMast = null;
        }
        // 递归查询
        if (Cools.isEmpty(locMast) || !locMast.getLocSts().equals("O")) {
            // 当前巷道无空库位时,递归调整至下一巷道,检索全部巷道无果后,跳出递归
            if (times < rowCount) {
                times = times + 1;
                return getLocNo(1, staDescId, sourceStaNo, matnr, batch, grade, moveCrnNo, locTypeDto, times);
            }
//            // 2.库位当前所属尺寸无空库位时,调整尺寸参数,向上兼容检索库位
//            if (locTypeDto.getLocType1() < 2) {
//                int i = locTypeDto.getLocType1() + 1;
//                locTypeDto.setLocType1((short)i);
//                return getLocNo(1, staDescId, sourceStaNo, matnr,batch,grade, locTypeDto, 0);
//            }
            log.error("系统没有空库位!!! 尺寸规格: {}, 轮询次数:{}", JSON.toJSONString(locTypeDto), times);
            throw new CoolException("没有空库位");
        }
        String locNo = locMast.getLocNo();
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        startupDto.setWorkNo(workNo);
        startupDto.setCrnNo(crnNo);
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setLocNo(locNo);
        return startupDto;
    }
}
src/main/java/com/zy/common/web/WcsController.java
@@ -433,7 +433,7 @@
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        StartupDto dto = commonService.getLocNo(1, 10, devpNo, null, null, null, locTypeDto);
        StartupDto dto = commonService.getLocNoEmpty(1, 10, devpNo, null, null, null, locTypeDto);
        int workNo = dto.getWorkNo();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();