自动化立体仓库 - WMS系统
#
LSH
2023-06-07 1af3b14449eb33792e606185c55643bca53efbb7
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -74,6 +74,8 @@
    @Autowired
    private WcsController wcsController;
    @Autowired
    private WaitPakinService waitPakinService;
    @Autowired
    private RowLastnoService rowLastnoService;
    @Autowired
    private SlaveProperties slaveProperties;
@@ -159,42 +161,94 @@
    @Override
    @Transactional
    public void startupFullTakeStore(StockOutParam param, Long userId) {
        ArrayList<String> locNos = new ArrayList<>();
        List<StockOutParam.LocDetl> locDetls = new ArrayList<>();
        ArrayList<String> matnrs = new ArrayList<>();//目的做数据去重
        //出库时,如果当前库位组有相同的物料,则先出外侧物料
        for (StockOutParam.LocDetl locDetl : param.getLocDetls()) {
            if (!matnrs.contains(locDetl.getMatnr())) {
                matnrs.add(locDetl.getMatnr());
            List<String> outerSingleLoc = Utils.getGroupOuterSingleLoc(locDetl.getLocNo());
            outerSingleLoc.add(locDetl.getLocNo());
            boolean flag = false;
            Double useCount = 0D;
            for (String locNo : outerSingleLoc) {
                for (LocDetl locDetl0 : locDetlService.selectByLocNo(locNo)) {
                    if (!locDetl0.getMatnr().equals(locDetl.getMatnr())) {
                        //不是相同物料
                        continue;
                    }
                    double lastCount = locDetl.getCount() - useCount;//剩余所需数量
                    double realCount = 0;//实际提供数量
                    if (lastCount==0){
                        continue;
                    }
                    if (locDetl0.getAnfme() >= lastCount) {//实际数量大于所需数量,按所需数量提供
                        realCount = lastCount;
                    } else {
                        //实际小于所需数量,按实际数量提供
                        realCount = locDetl0.getAnfme();
                    }
                    useCount += realCount;//已使用的数量
                //1.根据物料号先搜索高频区域是否有库存
                List<StockOutParam.LocDetl> locNoStep1 = this.findLocNoStep1(locDetl);
                if (locNoStep1 != null) {
                    locDetls.addAll(locNoStep1);
                    continue;
                    locDetls.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount));
                    flag = true;
                    if (useCount >= locDetl.getCount()) {
                        //找到的库存 >= 所需库存,满足条件
                        break;
                    }
                }
                //高频混放区域没有满足的库位,在单品区域进行搜索
                List<StockOutParam.LocDetl> locNoStep2 = this.findLocNoStep2(locDetl);
                if (locNoStep2 != null) {
                    locDetls.addAll(locNoStep2);
                    continue;
                }
                //低频混放区域进行搜索
                List<StockOutParam.LocDetl> locNoStep3 = this.findLocNoStep3(locDetl);
                if (locNoStep3 != null) {
                    locDetls.addAll(locNoStep3);
                    continue;
                }
            }
            if (!flag) {
                locDetls.add(locDetl);
            }
        }
        for (StockOutParam.LocDetl locDetl : locDetls) {
            if (!locNos.contains(locDetl.getLocNo())) {
                locNos.add(locDetl.getLocNo());
            }
        }
//        ArrayList<String> locNos = new ArrayList<>();
//        for (StockOutParam.LocDetl locDetl:param.getLocDetls()){
//            if (!locNos.contains(locDetl.getLocNo())){
//                locNos.add(locDetl.getLocNo());
//            }
//        }
//        List<StockOutParam.LocDetl> locDetls = param.getLocDetls();
//        ArrayList<String> locNos = new ArrayList<>();
//        List<StockOutParam.LocDetl> locDetls = new ArrayList<>();
//        ArrayList<String> matnrs = new ArrayList<>();//目的做数据去重
//        for (StockOutParam.LocDetl locDetl : param.getLocDetls()) {
//            if (!matnrs.contains(locDetl.getMatnr())) {
//                matnrs.add(locDetl.getMatnr());
//
//                //1.根据物料号先搜索高频区域是否有库存
//                List<StockOutParam.LocDetl> locNoStep1 = this.findLocNoStep1(locDetl);
//                if (locNoStep1 != null) {
//                    locDetls.addAll(locNoStep1);
//                    continue;
//                }
//
//                //高频混放区域没有满足的库位,在单品区域进行搜索
//                List<StockOutParam.LocDetl> locNoStep2 = this.findLocNoStep2(locDetl);
//                if (locNoStep2 != null) {
//                    locDetls.addAll(locNoStep2);
//                    continue;
//                }
//
//                //低频混放区域进行搜索
//                List<StockOutParam.LocDetl> locNoStep3 = this.findLocNoStep3(locDetl);
//                if (locNoStep3 != null) {
//                    locDetls.addAll(locNoStep3);
//                    continue;
//                }
//
//            }
//        }
//
//        for (StockOutParam.LocDetl locDetl : locDetls) {
//            if (!locNos.contains(locDetl.getLocNo())) {
//                locNos.add(locDetl.getLocNo());
//            }
//        }
//        //检测提交的出库库位是否合法(浅库位有非空库位)
//        Utils.checkStockOutLocNo(locNos);
@@ -403,9 +457,14 @@
                }
            }
            List<String> outerLoc = Utils.getGroupOuterSingleLoc(locNo);
            List<String> outerLocs = Utils.getGroupOuterSingleLoc(locNo);
            Double wrkPri = 15D;
            for (LocMast locMast : locMastService.selectByLocNos(outerLoc)) {
            for (String outerLoc : outerLocs) {
                LocMast locMast = locMastService.selectById(outerLoc);
                if (locMast == null) {
                    continue;
                }
                if (!locMast.getLocSts().equals("F")) {
                    continue;
                }
@@ -415,13 +474,16 @@
                    if (!locDetl.getMatnr().equals(matnr)) {
                        flag = true;
                        break;
                    }else if (ioWorkType.equals(IoWorkType.CHECK_OUT)){
                        flag = true;
                        break;
                    }
                }
                if (flag) {
                    //当前巷道存在不同规格的物料,需要进行101全板出库
                    // 获取路径
                    StaDesc staDesc = staDescService.queryCrnStn(101, locMast.getCrnNo(), staNo.getDevNo(), locMast.getRow1());
                    StaDesc staDesc = staDescService.queryCrnStn(101, locMast.getCrnNo(), locMast.getCrnNo()==1? 100:200 , locMast.getRow1());
                    if(staDesc == null){
                        throw new CoolException("出库路径不存在");
                    }
@@ -439,7 +501,7 @@
                    wrkMast.setOutMost(0);
                    wrkMast.setCrnNo(locMast.getCrnNo());
                    wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站
                    wrkMast.setStaNo(staDesc.getStnNo()); // 目标站
                    wrkMast.setStaNo(locMast.getCrnNo()==1? 100:200); // 目标站
                    wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位
                    wrkMast.setFullPlt("Y"); // 满板:Y
                    wrkMast.setPicking("N"); // 拣料
@@ -467,8 +529,33 @@
                        wrkDetl.setModiTime(now);
                        wrkDetl.setModiUser(userId);
                        wrkDetl.setSpecs(locDetl.getSpecs());
                        wrkDetl.setMatType(locDetl.getMatType());
                        wrkDetl.setZpallet(locMast.getBarcode());
                        if (!wrkDetlService.insert(wrkDetl)) {
                            throw new CoolException("保存工作档明细失败");
                        }
                        Mat mat = matService.selectByMatnr(locDetl.getMatnr());
                        if (Cools.isEmpty(mat)) {
                            throw new CoolException(locDetl.getMatnr() + "商品档案不存在");
                        }
                        WaitPakin waitPakin = new WaitPakin();
                        waitPakin.sync(mat);
                        waitPakin.setBatch("");
                        waitPakin.setZpallet(locMast.getBarcode());   // 托盘码
                        waitPakin.setIoStatus("N");     // 入出状态
                        waitPakin.setAnfme(locDetl.getAnfme());  // 数量
                        waitPakin.setStatus("Y");    // 状态
                        waitPakin.setAppeUser(userId);
                        waitPakin.setAppeTime(now);
                        waitPakin.setModiUser(userId);
                        waitPakin.setModiTime(now);
                        waitPakin.setMemo(locDetl.getMemo());
                        waitPakin.setFrozen(0); // 是否冻结
                        waitPakin.setManu(locDetl.getManu());
                        waitPakin.setMatType(mat.getMatType());//物料类型
                        if (!waitPakinService.insert(waitPakin)) {
                            throw new CoolException("保存入库通知档失败");
                        }
                    }
                    // 修改库位状态:   F.在库 ====>>> R.出库预约
@@ -501,10 +588,15 @@
            LocMast locMast = locMastService.selectById(dto.getLocNo());
            //-----------------2023.6.2出库兼容代码-----------------------
            List<LocDetl> locDetls = locDetlService.selectByLocNo(locMast.getLocNo());
            if (locMast.getLocType2() == 1 && locDetls.size() > 1) {
                //单品区域出库物料大于1种,强制变成101全板出库
                ioType = 101;
            if (ioType!=107){
                List<LocDetl> locDetls = locDetlService.selectByLocNo(locMast.getLocNo());
                if (locMast.getLocType2() == 1 && locDetls.size() > 1) {
                    //单品区域出库物料大于1种,强制变成101全板出库
                    ioType = 101;
                    if (staNo.getDevNo()==300){
                        staNo.setDevNo(200);
                    }
                }
            }
            //-----------------2023.6.2出库兼容代码end-----------------------
@@ -559,6 +651,8 @@
                wrkDetl.setModiTime(now);
                wrkDetl.setModiUser(userId);
                wrkDetl.setSpecs(detlDto.getLocDetl().getSpecs());
                wrkDetl.setMatType(detlDto.getLocDetl().getMatType());
                wrkDetl.setZpallet(locMast.getBarcode());
                if (!wrkDetlService.insert(wrkDetl)) {
                    throw new CoolException("保存工作档明细失败");
                }
@@ -645,6 +739,7 @@
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiTime(now);
            wrkDetl.setModiUser(userId);
            wrkDetl.setMatType(locDetl.getMatType());
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作档明细失败");
            }
@@ -967,6 +1062,7 @@
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiTime(now);
            wrkDetl.setModiUser(userId);
            wrkDetl.setMatType(locDetl.getMatType());
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作档明细失败");
            }
@@ -1456,6 +1552,7 @@
                    wrkDetl.setAppeUser(9527L);
                    wrkDetl.setModiTime(now);
                    wrkDetl.setModiUser(9527L);
                    wrkDetl.setMatType(locDetl.getMatType());
                    if (!wrkDetlService.insert(wrkDetl)) {
                        throw new CoolException("保存工作档明细失败");
                    }