|  |  | 
 |  |  |     @Autowired | 
 |  |  |     private WcsController wcsController; | 
 |  |  |     @Autowired | 
 |  |  |     private WaitPakinService waitPakinService; | 
 |  |  |     @Autowired | 
 |  |  |     private RowLastnoService rowLastnoService; | 
 |  |  |     @Autowired | 
 |  |  |     private SlaveProperties slaveProperties; | 
 |  |  | 
 |  |  |     @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<>();//目的做数据去重 | 
 |  |  |         List<String> locs = new ArrayList<>(); | 
 |  |  |         for(StockOutParam.LocDetl one : param.getLocDetls()){ | 
 |  |  |             locs.add(one.getLocNo()); | 
 |  |  |         } | 
 |  |  |         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; | 
 |  |  |             //获取同一库位组的外侧库位号 | 
 |  |  |             List<String> groupOuterSingleLoc = Utils.getGroupOuterSingleLoc(locDetl.getLocNo()); | 
 |  |  |             for (String locNo : groupOuterSingleLoc) { | 
 |  |  |                 //每个库位的库位明细 | 
 |  |  |                 for (LocDetl detl : locDetlService.selectByLocNo(locNo)) { | 
 |  |  |                     if (!detl.getMatnr().equals(locDetl.getMatnr())) { | 
 |  |  |                         //不是相同物料 | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     locDetls.add(new StockOutParam.LocDetl(detl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), detl.getAnfme())); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |             locDetls.add(locDetl); | 
 |  |  |         } | 
 |  |  |         //出库时,如果当前库位组有相同的物料,则先出外侧物料 6.30日 注释 | 
 |  |  |         //for (StockOutParam.LocDetl locDetl : param.getLocDetls()) { | 
 |  |  |         //    List<String> outerSingleLoc = Utils.getGroupOuterSingleLoc(locDetl.getLocNo()); | 
 |  |  |         //    boolean flag = false; | 
 |  |  |         //    Double useCount = 0D; | 
 |  |  |         //    for (String locNo : outerSingleLoc) { | 
 |  |  |         //        if(locs.contains(locNo)) continue; | 
 |  |  |         //        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;//已使用的数量 | 
 |  |  |         // | 
 |  |  |         //            locDetls.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount)); | 
 |  |  |         //            flag = true; | 
 |  |  |         //            if (useCount >= locDetl.getCount()) { | 
 |  |  |         //                //找到的库存 >= 所需库存,满足条件 | 
 |  |  |         //                break; | 
 |  |  |         //            } | 
 |  |  |         //        } | 
 |  |  |         //    } | 
 |  |  |         // | 
 |  |  |         //    if (!flag) { | 
 |  |  |         //        locDetls.add(locDetl); | 
 |  |  |         //    } | 
 |  |  |         // | 
 |  |  |         //} | 
 |  |  |  | 
 |  |  |         for (StockOutParam.LocDetl locDetl : locDetls) { | 
 |  |  |             if (!locNos.contains(locDetl.getLocNo())) { | 
 |  |  |                 locNos.add(locDetl.getLocNo()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         // TODO: 2023/6/28 等李薇确认是否使用 | 
 |  |  |         // ---------------------------------------------- | 
 |  |  |         //for(StockOutParam.LocDetl one : param.getLocDetls()){ | 
 |  |  |         //    List<String> outerSingleLoc = Utils.getGroupOuterSingleLoc(one.getLocNo()); | 
 |  |  |         //    for (String s : outerSingleLoc) { | 
 |  |  |         //        if (!locs.contains(s)) { | 
 |  |  |         //            throw new CoolException("浅库位有相同物料不支持出库"); | 
 |  |  |         //        } | 
 |  |  |         //    } | 
 |  |  |         //} | 
 |  |  |         // ---------------------------------------------- | 
 |  |  |  | 
 |  |  | //        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); | 
 |  |  | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             List<String> outerLoc = Utils.getGroupOuterSingleLoc(locNo); | 
 |  |  |             List<String> outerLocs = Utils.getGroupOuterSingleLoc(locNo); | 
 |  |  |             Double wrkPri = 15D; | 
 |  |  |             for (LocMast locMast : locMastService.selectByLocNos(outerLoc)) { | 
 |  |  |                 if (!locMast.getLocSts().equals("F")) { | 
 |  |  |             for (String outerLoc : outerLocs) { | 
 |  |  |                 LocMast locMast = locMastService.selectById(outerLoc); | 
 |  |  |                 if (locMast == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if (!locMast.getLocSts().equals("F")) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 //if (locMast.getLocSts().equals("F")) { | 
 |  |  |                 //    throw new CoolException("浅库位在库不支持此任务"); | 
 |  |  |                 //} | 
 |  |  |                 boolean flag = false; | 
 |  |  |                 for (LocDetl locDetl : locDetlService.selectByLocNo(locMast.getLocNo())) { | 
 |  |  |                     if (!locDetl.getMatnr().equals(matnr)) { | 
 |  |  |                         flag = true; | 
 |  |  |                         break; | 
 |  |  |                     }else if (!Cools.isEmpty(ioWorkType) && 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("出库路径不存在"); | 
 |  |  |                     } | 
 |  |  | 
 |  |  |                     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"); // 拣料 | 
 |  |  | 
 |  |  |                         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.出库预约 | 
 |  |  | 
 |  |  |             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----------------------- | 
 |  |  |  | 
 |  |  | 
 |  |  |                 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("保存工作档明细失败"); | 
 |  |  |                 } | 
 |  |  | 
 |  |  |             wrkDetl.setAppeUser(userId); | 
 |  |  |             wrkDetl.setModiTime(now); | 
 |  |  |             wrkDetl.setModiUser(userId); | 
 |  |  |             wrkDetl.setMatType(locDetl.getMatType()); | 
 |  |  |             if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                 throw new CoolException("保存工作档明细失败"); | 
 |  |  |             } | 
 |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional | 
 |  |  |     public void locCheckOut(StockOutParam param, Long userId) { | 
 |  |  |         // if (wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 107)) > 0) { | 
 |  |  |         //     throw new CoolException("只能存在一笔盘点任务"); | 
 |  |  |         // } | 
 |  |  |          if (wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 107)) > 0) { | 
 |  |  |              throw new CoolException("只能存在一笔盘点任务"); | 
 |  |  |          } | 
 |  |  |         // 目标站点状态检测 | 
 |  |  |         BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite()); | 
 |  |  |         // 获取库位明细 | 
 |  |  | 
 |  |  |             wrkDetl.setAppeUser(userId); | 
 |  |  |             wrkDetl.setModiTime(now); | 
 |  |  |             wrkDetl.setModiUser(userId); | 
 |  |  |             wrkDetl.setMatType(locDetl.getMatType()); | 
 |  |  |             if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                 throw new CoolException("保存工作档明细失败"); | 
 |  |  |             } | 
 |  |  | 
 |  |  |                     wrkDetl.setAppeUser(9527L); | 
 |  |  |                     wrkDetl.setModiTime(now); | 
 |  |  |                     wrkDetl.setModiUser(9527L); | 
 |  |  |                     wrkDetl.setMatType(locDetl.getMatType()); | 
 |  |  |                     if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                         throw new CoolException("保存工作档明细失败"); | 
 |  |  |                     } |