自动化立体仓库 - WMS系统
lty
2025-01-03 94c1bea63d0557a1f806e13df95074d652d26ad8
src/main/java/com/zy/common/service/CommonService.java
@@ -17,6 +17,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
@@ -50,7 +51,8 @@
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private LocRuleService locRuleService;
    /**
     * 生成工作号
     *
@@ -128,9 +130,8 @@
                case 4:
                    return getLocNoRun4(whsType, staDescId, sourceStaNo, matnr, batch, grade, 4, locTypeDto, 0);
            }
        } catch (Exception e) {
            log.error("站点={} 未查询到对应的规则", sourceStaNo);
        } catch (CoolException ex) {
            log.error("入库失败,错误信息: {}", ex.getMessage(), ex);
        }
        return null;
    }
@@ -445,150 +446,148 @@
    }
    public StartupDto getLocNoRun4(Integer whsType, Integer staDescId, Integer sourceStaNo, String matnr, String batch, String grade, Integer moveCrnNo, LocTypeDto locTypeDto, int times) {
        int rowCount = 0;   //轮询轮次
        int crnNo = 0;
        int crnNo = 1;//小车编号备用
        RowLastno rowLastno = rowLastnoService.selectById(4);
        LocMast locMast = null;     // 目标库位
        StartupDto startupDto = new StartupDto();
        int MaxBay = rowLastno.getCurrentRow();
        int sRow = rowLastno.getsRow();
        int eRow = rowLastno.geteRow();
        //满版空板入库规则
        switch (staDescId){
            //全板
            case 1:
                // 从第 3 列开始 轮询每一列
                int currentBay = 1;
                while (currentBay <= MaxBay) { //
                    locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                            .ge("row1", sRow) // 排范围:起始到结束
                            .le("row1", eRow)
                            .ne("row1", 8) // 排除第8排
                            .eq("loc_sts", "O") // 空库位
                            .eq("bay1", currentBay) // 当前列
                            .eq("loc_type1", locTypeDto.getLocType1())
                            .orderBy("row1 ASC, lev1 ASC")); // 按排和层排序
                    if (!Cools.isEmpty(locMast)) {
                        // 检查是否符合商品编号和批号规则
                        LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>()
                                .eq("loc_no", locMast.getLocNo())
                                .andNew()
                                .eq("matnr", matnr)
                                .eq("batch", batch));
        if (!Cools.isEmpty(matnr) && staDescId != 10) {
            int lev = 0;
//            List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("matnr", matnr));
//            if (!Cools.isEmpty(locDetls)){
//                for (LocDetl locDetl : locDetls){
//                    if (locMast != null){
//                        break;
//                    }
//                    LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo()));
//                    if (Cools.isEmpty(locMast1)) {
//                        continue;
//                    }
//                    if (locMast1.getLev1() != lev && locMast1.getLev1() !=3) {
//                        List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
//                                .eq("lev1", locMast1.getLev1())
//                                .orderBy("bay1",false));
//                        if (Cools.isEmpty(locMasts)){
//                            throw new CoolException("数据异常,请联系管理员===》库位未知");
//                        }
//                        for (LocMast locMast2 : locMasts) {
//                            if (locMast2.getLocSts().equals("O") ) {
//                                if (locMast == null){
//                                    locMast = locMast2;
//                                }
//                            }else if (locMast2.getLocSts().equals("F")){
//                                locMast = null;
//                            }
//                        }
//                    }
//                }
//                if(Cools.isEmpty(locMast)){
//                    List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
//                            .eq("lev1", 1)
//                            .orderBy("bay1",false));
//                    for (LocMast locMast2 : locMasts) {
//                        if (locMast2.getLocSts().equals("O") ) {
//                            if (locMast == null){
//                                locMast = locMast2;
//                            }
//                        }else if (locMast2.getLocSts().equals("F")){
//                            locMast = null;
//                        }
//                    }
//                }
//                if(Cools.isEmpty(locMast)){
//                    List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
//                            .eq("lev1", 2)
//                            .orderBy("bay1",false));
//                    for (LocMast locMast2 : locMasts) {
//                        if (locMast2.getLocSts().equals("O") ) {
//                            if (locMast == null){
//                                locMast = locMast2;
//                            }
//                        }else if (locMast2.getLocSts().equals("F")){
//                            locMast = null;
//                        }
//                    }
//                }
//            }else {
            for (int i = 1; i <= 2; i++) {
                if (locMast != null) {
                    break;
                }
//                List<LocMast> locMastsF = locMastService.selectList(new EntityWrapper<LocMast>()
//                        .eq("lev1", i)
//                        .eq("loc_sts", "F"));
//                if (!Cools.isEmpty(locMastsF)) {
//                    continue;
//                }
                List<LocMast> locMastsR = locMastService.selectList(new EntityWrapper<LocMast>()
                        .eq("lev1", i)
                        .eq("loc_sts", "R"));
                if (!Cools.isEmpty(locMastsR)) {
                    WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("loc_no", locMastsR.get(0).getLocNo()));
                    if (Cools.isEmpty(wrkMast)) {
                        continue;
                    }
                    List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
                    if (!wrkDetls.get(0).getMatnr().equals(matnr)) {
                        continue;
                    }
                }
                List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                        .eq("lev1", i)
                        .orderBy("bay1", false));
                if (Cools.isEmpty(locMasts)) {
                    throw new CoolException("数据异常,请联系管理员===》库位未知");
                }
                for (LocMast locmast3 : locMasts) {
                    if (locmast3.getLocSts().equals("O")) {
                        if (locMast == null) {
                            locMast = locmast3;
                        if (Cools.isEmpty(locDetl) || (matnr.equals(locDetl.getMatnr()) && batch.equals(locDetl.getBatch()))) {
                            // 找到符合条件的库位,跳出循环
                            break;
                        }
                    } else if (locmast3.getLocSts().equals("F")) {
                        locMast = null;
                    }
                    // 当前列无空位,检查下一列
                    currentBay++;
                }
                // ③ 如果第一排全满,检索第8排
                if (Cools.isEmpty(locMast)) {
                    for (int bay = 1; bay <= MaxBay; bay++) {
                        locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("row1", 8) // 第8排
                                .eq("loc_sts", "O") // 空库位状态
                                .eq("bay1", bay) // 当前列
                                .orderBy("lev1 ASC")); // 按层排序
                        if (!Cools.isEmpty(locMast)) {
                            break; // 找到符合条件的库位,退出循环
                        }
                    }
                }
            }
//            }
        } else {
            //空板入库
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                    .eq("lev1", 3)
                    .orderBy("bay1", true));
            if (Cools.isEmpty(locMasts)) {
                throw new CoolException("数据异常,请联系管理员===》库位未知");
            }
            for (LocMast locmast : locMasts) {
                if (locmast.getLocSts().equals("O")) {
                    if (locMast == null) {
                        locMast = locmast;
                    }
                } else if (locmast.getLocSts().equals("D")) {
                    locMast = null;
                // 如果没有找到符合条件的库位
                if (Cools.isEmpty(locMast)) {
                    log.error("系统没有空库位!!! 尺寸规格: {},", JSON.toJSONString(locTypeDto));
                    throw new CoolException("没有空库位");
                }
            }
                break;
            // 空板规则
            case 10:
                // ① 优先检索第1排所有列状态为 "D" 的库位
                // 标签,用于跳出外层循环
                outerLoop:
                for (int bay = 1; bay <= MaxBay; bay++) {
                    locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                            .eq("row1", sRow) // 第一排
                            .eq("loc_sts", "D") // 空板状态
                            .eq("bay1", bay) // 当前列
                            .ne("row1", 8) // 排除第8排
                            .orderBy("lev1 ASC")); // 按层排序
                    if (!Cools.isEmpty(locMast)) {
                        // 从当前列找到状态为 "D" 的库位后,向外依次检索排
                        for (int row = sRow + 1; row <= eRow; row++) { // 从第二排开始
                            LocMast potentialLoc = locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("row1", row) // 当前排
                                    .eq("loc_sts", "O") // 空库位状态
                                    .eq("bay1", bay) // 当前列
                                    .ne("row1", 8) // 排除第8排
                                    .eq("lev1",locMast.getLev1())); //当前层
                            if (!Cools.isEmpty(potentialLoc)) {
                                locMast = potentialLoc; // 更新为找到的空库位
                                break outerLoop; // 找到符合条件的库位,跳出外层循环
                            }
                        }
                    }
                }
                // ② 如果第1排没有找到 "D",检索状态为 "O" 的库位
                if (Cools.isEmpty(locMast)) {
                    for (int bay = 1; bay <= MaxBay; bay++) {
                        locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("row1", sRow) // 第一排
                                .eq("loc_sts", "O") // 空库位状态
                                .eq("bay1", bay) // 当前列
                                .orderBy("lev1 ASC")); // 按层排序
                        if (!Cools.isEmpty(locMast)) {
                            break; // 找到符合条件的库位,退出循环
                        }
                    }
                }
                // ③ 如果第一排全满,检索第8排
                if (Cools.isEmpty(locMast)) {
                    for (int bay = 1; bay <= MaxBay; bay++) {
                        locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("row1", 8) // 第8排
                                .eq("loc_sts", "O") // 空库位状态
                                .eq("bay1", bay) // 当前列
                                .orderBy("lev1 ASC")); // 按层排序
                        if (!Cools.isEmpty(locMast)) {
                            break; // 找到符合条件的库位,退出循环
                        }
                    }
                }
                // 如果仍然没有找到符合条件的库位
                if (Cools.isEmpty(locMast)) {
                    log.error("系统没有空库位!!! 尺寸规格: {},", JSON.toJSONString(locTypeDto));
                    throw new CoolException("没有空库位");
                }
                break;
            default:
                throw new CoolException("不支持的库位规则类型: " + staDescId);
        }
        // 递归查询
        if (Cools.isEmpty(locMast) || !locMast.getLocSts().equals("O")) {
            // 当前巷道无空库位时,递归调整至下一巷道,检索全部巷道无果后,跳出递归
            if (times < rowCount * 2) {
                times = times + 1;
                return getLocNoRun4(whsType, staDescId, sourceStaNo, matnr, batch, grade, moveCrnNo, locTypeDto, times);
            }
            log.error("系统没有空库位!!! 尺寸规格: {}, 轮询次数:{}", JSON.toJSONString(locTypeDto), times);
            throw new CoolException("没有空库位");
        }
        // 返回找到的库位
        String locNo = locMast.getLocNo();
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        startupDto.setWorkNo(workNo);
        startupDto.setCrnNo(1);
        startupDto.setCrnNo(locMast.getCrnNo());
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setLocNo(locNo);
        return startupDto;
    }