自动化立体仓库 - WMS系统
#
zjj
2025-03-27 681d5587c0d926711861269047d38e3502ff5fa3
src/main/java/com/zy/common/service/CommonService.java
@@ -127,7 +127,7 @@
            RowLastno rowLastno = rowLastnoService.selectById(whsType);
            RowLastnoType rowLastnoType = rowLastnoTypeService.selectById(rowLastno.getTypeId());
            /**
             * 库型 1: 标准堆垛机库  2: 平库  3: 穿梭板  4: 四向车  5: AGV  0: 未知
             * 库型 1: 标准堆垛机库  2: 平库  3: 穿梭板  4: 四向车混载  5: AGV 6:四向车不混载 0: 未知
             */
            switch (rowLastnoType.getType()){
                case 1:
@@ -142,6 +142,8 @@
                    return getLocNoRun4(whsType,staDescId,sourceStaNo,matnr,batch,grade,4,locTypeDto,0,mixture);
                case 5:
                    return getLocNoRun5(whsType,staDescId,sourceStaNo,matnr,batch,grade,0,locTypeDto,0);
                case 6:
                    return getLocNoRun6(whsType,staDescId,sourceStaNo,matnr,batch,grade,4,locTypeDto,0,mixture);
                default:
                    log.error("站点={} 未查询到对应的规则",sourceStaNo);
                    break;
@@ -472,6 +474,9 @@
    }
    public StartupDto getLocNoRun4(Integer whsType, Integer staDescId, Integer sourceStaNo, String matnr, String batch, String grade, Integer moveCrnNo, LocTypeDto locTypeDto, int times,boolean mixture) {
        if (mixture){
            throw new CoolException("混载禁止入库");
        }
        if (Cools.isEmpty(matnr)) {  //物料号
            matnr = "";
        }
@@ -811,6 +816,212 @@
        return startupDto;
    }
    public StartupDto getLocNoRun6(Integer whsType, Integer staDescId, Integer sourceStaNo, String matnr, String batch, String grade, Integer moveCrnNo, LocTypeDto locTypeDto, int times,boolean mixture) {
        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);
        if (Cools.isEmpty(rowLastno)) {
            throw new CoolException("数据异常,请联系管理员===>库位规则未知");
        }
        RowLastnoType rowLastnoType = rowLastnoTypeService.selectById(rowLastno.getTypeId());
        if (Cools.isEmpty(rowLastnoType)) {
            throw new CoolException("数据异常,请联系管理员===》库位规则类型未知");
        }
        int sRow = rowLastno.getsRow();
        int eRow = rowLastno.geteRow();
        int crnNumber = rowLastno.getCrnQty();
        // ===============>>>> 开始执行
        curRow = rowLastno.getCurrentRow();
        if (!Cools.isEmpty(moveCrnNo) && moveCrnNo!=0){
            crnNumber = moveCrnNo;
        }
        //此程序用于优化堆垛机异常时的运行时间
        for (int i = times; i < crnNumber*2; i++) {
            int[] locNecessaryParameters = Utils.LocNecessaryParameters(rowLastno, curRow, crnNumber,whsType);
            rowCount =  locNecessaryParameters[0];
            curRow = locNecessaryParameters[1];
            crnNo = locNecessaryParameters[2];
            nearRow = locNecessaryParameters[3];
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                    .eq("crn_no", crnNo).eq("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue()));
            if (locMasts.size()<=5){
                times++;
                continue;
            }
            break;
        }
        if (crnNo == 0) {
            throw new CoolException("无可用库位");
        }
        // 相似工作档案 --- 同天同规格物料
        if (!Cools.isEmpty(matnr) && (staDescId == 1 || staDescId == 11 || staDescId == 111) && !mixture ) {
            //查询相似工作档案
            List<WrkMast> wrkMasts = wrkMastService.selectWrkMastWrkDetlMatnrBatch(staDescId, matnr, batch,grade, crnNo);
            int nearbay = 0;    //相似工作档案 目标库位列
            int nearlev = 0;    //相似工作档案 目标库位层
            for (WrkMast wrkMast:wrkMasts){
                LocMast locMastWrk = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", wrkMast.getLocNo()));
                List<LocMast> locMasts = new ArrayList<>();
                if (locMastWrk.getBay1() >=5 && locMastWrk.getBay1()<=6){
                    locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                            .eq("gro1", locMastWrk.getGro1())
                            .eq("crn_no", 7)
                            .eq("loc_type1",locTypeDto.getLocType1())
                            .orderBy("bay1", true));
                }else {
                    locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                            .eq("gro1", locMastWrk.getGro1())
                            .eq("crn_no", 7)
                            .eq("loc_type1",locTypeDto.getLocType1())
                            .orderBy("bay1", false));
                }
                if (Cools.isEmpty(locMasts)) {
                    continue;
                }
                for (LocMast locMastGro1 : locMasts) {
                    if (locMastGro1.getLocSts().equals("P") || locMastGro1.getLocSts().equals("Q") || locMastGro1.getLocSts().equals("R") || locMastGro1.getLocSts().equals("X")) {
                        break;
                    }
                    if (locMastGro1.getLocSts().equals("O")){
                        locMast = locMastGro1;
                        break;
                    }
                }
            }
        }
        Wrapper<StaDesc> wrapper = null;
        StaDesc staDesc = null;
        BasDevp staNo = null;
        if (Utils.BooleanWhsTypeSta(rowLastno, 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);
                crnNo = 0;
            }else {
                staNo = basDevpService.selectById(staDesc.getCrnStn());
                if (!staNo.getAutoing().equals("Y")) {
                    log.error("目标站"+staDesc.getCrnStn()+"不可用");
                    crnNo = 0;
                }
                startupDto.setStaNo(staNo.getDevNo());
            }
        }
        // 更新库位排号
        if (Utils.BooleanWhsTypeSta(rowLastno, staDescId) && Cools.isEmpty(locMast)) {
            rowLastno.setCurrentRow(curRow);
            rowLastnoService.updateById(rowLastno);
        }
        // 开始查找库位 ==============================>>
        // 1.按规则查找库位
        if (Cools.isEmpty(locMast) && crnNo != 0) {
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                    .eq("bay1", nearRow)
                    .in("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue())
                    .eq("crn_no",7)
                    .eq("loc_type1",locTypeDto.getLocType1())
                    .orderBy("lev1",true).orderBy("row1",false));//最浅库位
            for (LocMast locMast1 : locMasts) {
                if (locMast != null){
                    break;
                }
                if (!VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) {
                    continue;
                }
                if (Utils.BooleanWhsTypeStaIoType(rowLastno)){
                    List<LocMast> locMasts1 = null;
                    if (nearRow == 6){
                        locMasts1 = locMastService.selectList(new EntityWrapper<LocMast>()
                                .eq("gro1", locMast1.getGro1())
                                .eq("crn_no",7)
                                .eq("loc_type1",locTypeDto.getLocType1())
                                .orderBy("bay1",true));
                    }else {
                        locMasts1 = locMastService.selectList(new EntityWrapper<LocMast>()
                                .eq("gro1", locMast1.getGro1())
                                .eq("crn_no",7)
                                .eq("loc_type1",locTypeDto.getLocType1())
                                .orderBy("bay1",false));
                    }
                    if (Cools.isEmpty(locMasts1)) {
                        continue;
                    }
                    for (LocMast locMastGro1 : locMasts1) {
                        if (locMastGro1.getLocSts().equals("F")){
                            LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_No", locMastGro1.getLocNo()));
                            if (!locDetl.getMatnr().equals(matnr) || !locDetl.getBatch().equals(batch)){
                                break;
                            }
                        }
                        if (locMastGro1.getLocSts().equals("P") || locMastGro1.getLocSts().equals("Q") || locMastGro1.getLocSts().equals("R")) {
                            break;
                        }
                        if (locMastGro1.getLocSts().equals("O")){
                            locMast = locMastGro1;
                            break;
                        }
                    }
                }
            }
        }
        // 递归查询
        if (Cools.isEmpty(locMast) || !locMast.getLocSts().equals("O")) {
            // 当前巷道无空库位时,递归调整至下一巷道,检索全部巷道无果后,跳出递归
            if (times < rowCount*2) {
                times = times + 1;
                return getLocNoRun6(whsType, staDescId, sourceStaNo, matnr, batch, grade,moveCrnNo, locTypeDto, times,mixture);
            }
            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;
    }
    public static String zerofill(String msg, Integer count) {
        if (msg.length() == count) {
            return msg;