|  |  | 
 |  |  |     @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) { | 
 |  |  |         List<StockOutParam.LocDetl> locDetls = new ArrayList<>(); | 
 |  |  |         List<String> locs = new ArrayList<>(); | 
 |  |  |         for(StockOutParam.LocDetl one : param.getLocDetls()){ | 
 |  |  |             locs.add(one.getLocNo()); | 
 |  |  |         } | 
 |  |  |         for (StockOutParam.LocDetl locDetl : param.getLocDetls()) { | 
 |  |  |             //获取同一库位组的外侧库位号 | 
 |  |  |             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); | 
 |  |  |         //    } | 
 |  |  |         // | 
 |  |  |         //} | 
 |  |  |  | 
 |  |  |         // 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); | 
 |  |  |  | 
 |  |  |         // 目标站点状态检测 | 
 |  |  |         BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite()); | 
 |  |  |         // 获取库位明细 | 
 |  |  |         List<LocDetlDto> locDetlDtos = new ArrayList<>(); | 
 |  |  |         for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) { | 
 |  |  |         for (StockOutParam.LocDetl paramLocDetl : locDetls) { | 
 |  |  |             if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) { | 
 |  |  |                 LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch()); | 
 |  |  |                 if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount())); | 
 |  |  | 
 |  |  |         } else { | 
 |  |  |             throw new CoolException("库存不存在"); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //1.根据物料号先搜索高频区域是否有库存 | 
 |  |  |     private List<StockOutParam.LocDetl> findLocNoStep1(StockOutParam.LocDetl locDetl) { | 
 |  |  |         List<StockOutParam.LocDetl> locDetlList = new ArrayList<>(); | 
 |  |  |         //1.根据物料号先搜索高频区域是否有库存 | 
 |  |  |         List<LocDetl> locDetls = locDetlService.findHighAreaByMatnr(locDetl.getMatnr()); | 
 |  |  |         if (locDetls.size() > 0) { | 
 |  |  |             for (LocDetl locDetl0 : locDetls) { | 
 |  |  |                 if (locDetl0.getAnfme() >= locDetl.getCount()) { | 
 |  |  |                     //找到的库存 >= 所需库存,满足条件 | 
 |  |  |                     locDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), locDetl.getCount())); | 
 |  |  |                     return locDetlList; | 
 |  |  |                 } else { | 
 |  |  |                     //不满足库存条件 | 
 |  |  |                     //判断最外侧库位的深处是否有相同物料 | 
 |  |  |                     Double useCount = locDetl0.getAnfme();//已使用的数量 | 
 |  |  |                     List<StockOutParam.LocDetl> tmpLocDetlList = new ArrayList<>();//记录经过的库位 | 
 |  |  |                     tmpLocDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), locDetl0.getAnfme())); | 
 |  |  |  | 
 |  |  |                     List<String> insideLoc = Utils.getGroupInsideLoc(locDetl0.getLocNo()); | 
 |  |  |                     List<LocDetl> locDetls1 = locDetlService.selectByLocNosAndMatnr(insideLoc, locDetl.getMatnr()); | 
 |  |  |                     if (locDetls1.size() == 0) {//内侧库位没有相同的物料,跳过 | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     int locRow = Utils.getRow(locDetl0.getLocNo()); | 
 |  |  |                     switch (locRow) { | 
 |  |  |                         case 3: | 
 |  |  |                         case 11: | 
 |  |  |                         case 18: | 
 |  |  |                             Collections.reverse(locDetls1); | 
 |  |  |                             break; | 
 |  |  |                     } | 
 |  |  |                     for (LocDetl detl : locDetls1) { | 
 |  |  |                         double lastCount = locDetl.getCount() - useCount;//剩余所需数量 | 
 |  |  |                         double realCount = 0;//实际提供数量 | 
 |  |  |                         if (detl.getAnfme() >= lastCount) {//实际数量大于所需数量,按所需数量提供 | 
 |  |  |                             realCount = lastCount; | 
 |  |  |                         }else { | 
 |  |  |                             //实际小于所需数量,按实际数量提供 | 
 |  |  |                             realCount = detl.getAnfme(); | 
 |  |  |                         } | 
 |  |  |                         useCount += realCount; | 
 |  |  |                         tmpLocDetlList.add(new StockOutParam.LocDetl(detl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount)); | 
 |  |  |                         if (useCount >= locDetl.getCount()) { | 
 |  |  |                             //找到的库存 >= 所需库存,满足条件 | 
 |  |  |                             locDetlList.addAll(tmpLocDetlList); | 
 |  |  |                             return locDetlList; | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //最外侧包括内侧都无满足库位,则判断搜索出来的全部最外侧库位加起来是否满足出库数量要求 | 
 |  |  |             Double useCount = 0D; | 
 |  |  |             for (LocDetl locDetl0 : locDetls) { | 
 |  |  |                 double lastCount = locDetl.getCount() - useCount;//剩余所需数量 | 
 |  |  |                 double realCount = 0;//实际提供数量 | 
 |  |  |                 if (locDetl0.getAnfme() >= lastCount) {//实际数量大于所需数量,按所需数量提供 | 
 |  |  |                     realCount = lastCount; | 
 |  |  |                 }else { | 
 |  |  |                     //实际小于所需数量,按实际数量提供 | 
 |  |  |                     realCount = locDetl0.getAnfme(); | 
 |  |  |                 } | 
 |  |  |                 useCount += realCount;//已使用的数量 | 
 |  |  |                 locDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount)); | 
 |  |  |                 if (useCount >= locDetl.getCount()) { | 
 |  |  |                     //找到的库存 >= 所需库存,满足条件 | 
 |  |  |                     return locDetlList; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //高频混放区域没有满足的库位,在单品区域进行搜索 | 
 |  |  |     private List<StockOutParam.LocDetl> findLocNoStep2(StockOutParam.LocDetl locDetl) { | 
 |  |  |         List<StockOutParam.LocDetl> locDetlList = new ArrayList<>(); | 
 |  |  |         //在单品区域进行搜索 | 
 |  |  |         List<LocDetl> locDetls = locDetlService.findSingleAreaByMatnr(locDetl.getMatnr()); | 
 |  |  |         if (locDetls.size() > 0) { | 
 |  |  |             Double useCount = 0D; | 
 |  |  |             for (LocDetl locDetl0 : locDetls) { | 
 |  |  |                 double lastCount = locDetl.getCount() - useCount;//剩余所需数量 | 
 |  |  |                 double realCount = 0;//实际提供数量 | 
 |  |  |                 if (locDetl0.getAnfme() >= lastCount) {//实际数量大于所需数量,按所需数量提供 | 
 |  |  |                     realCount = lastCount; | 
 |  |  |                 } else { | 
 |  |  |                     //实际小于所需数量,按实际数量提供 | 
 |  |  |                     realCount = locDetl0.getAnfme(); | 
 |  |  |                 } | 
 |  |  |                 useCount += realCount;//已使用的数量 | 
 |  |  |  | 
 |  |  |                 locDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount)); | 
 |  |  |                 if (useCount >= locDetl.getCount()) { | 
 |  |  |                     //找到的库存 >= 所需库存,满足条件 | 
 |  |  |                     return locDetlList; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //库存数量不满足 | 
 |  |  |             throw new CoolException("单品区域只有" + useCount + "个货物"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //低频混放区域进行搜索 | 
 |  |  |     private List<StockOutParam.LocDetl> findLocNoStep3(StockOutParam.LocDetl locDetl) { | 
 |  |  |         List<StockOutParam.LocDetl> locDetlList = new ArrayList<>(); | 
 |  |  |         //在单品区域进行搜索 | 
 |  |  |         List<LocDetl> locDetls = locDetlService.findLowAreaByMatnr(locDetl.getMatnr()); | 
 |  |  |         if (locDetls.size() > 0) { | 
 |  |  |             Double useCount = 0D; | 
 |  |  |             for (LocDetl locDetl0 : locDetls) { | 
 |  |  |                 double lastCount = locDetl.getCount() - useCount;//剩余所需数量 | 
 |  |  |                 double realCount = 0;//实际提供数量 | 
 |  |  |                 if (locDetl0.getAnfme() >= lastCount) {//实际数量大于所需数量,按所需数量提供 | 
 |  |  |                     realCount = lastCount; | 
 |  |  |                 }else { | 
 |  |  |                     //实际小于所需数量,按实际数量提供 | 
 |  |  |                     realCount = locDetl0.getAnfme(); | 
 |  |  |                 } | 
 |  |  |                 useCount += realCount;//已使用的数量 | 
 |  |  |  | 
 |  |  |                 locDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount)); | 
 |  |  |                 if (useCount >= locDetl.getCount()) { | 
 |  |  |                     //找到的库存 >= 所需库存,满足条件 | 
 |  |  |                     return locDetlList; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //-----------------2023.5.31上架区域版本兼容代码----------------------- | 
 |  |  |             //判断当前库位组是否均为同一种物料,如不是,则认定需要执行兼容代码 | 
 |  |  |             //需要将待出库库位前侧库位(不包含最外侧高频库位)执行101全板出库 | 
 |  |  |             String locNo = dto.getLocNo(); | 
 |  |  |             String matnr = null; | 
 |  |  |             for (LocDetlDto locDetlDto : dto.getLocDetlDtos()) { | 
 |  |  |                 LocDetl locDetl = locDetlDto.getLocDetl(); | 
 |  |  |                 if (locDetl.getLocNo().equals(locNo)) { | 
 |  |  |                     matnr = locDetl.getMatnr(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             List<String> outerLocs = Utils.getGroupOuterSingleLoc(locNo); | 
 |  |  |             Double wrkPri = 15D; | 
 |  |  |             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(), locMast.getCrnNo()==1? 100:200 , locMast.getRow1()); | 
 |  |  |                     if(staDesc == null){ | 
 |  |  |                         throw new CoolException("出库路径不存在"); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 生成工作号 | 
 |  |  |                     int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(101)); | 
 |  |  |                     // 生成工作档 | 
 |  |  |                     WrkMast wrkMast = new WrkMast(); | 
 |  |  |                     wrkMast.setWrkNo(workNo); | 
 |  |  |                     wrkMast.setIoTime(now); | 
 |  |  |                     wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID | 
 |  |  |                     wrkMast.setIoType(101); // 入出库状态101全板出库 | 
 |  |  |                     wrkPri += 2D; | 
 |  |  |                     wrkMast.setIoPri(wrkPri); // 优先级 | 
 |  |  |                     wrkMast.setOutMost(0); | 
 |  |  |                     wrkMast.setCrnNo(locMast.getCrnNo()); | 
 |  |  |                     wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站 | 
 |  |  |                     wrkMast.setStaNo(locMast.getCrnNo()==1? 100:200); // 目标站 | 
 |  |  |                     wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位 | 
 |  |  |                     wrkMast.setFullPlt("Y"); // 满板:Y | 
 |  |  |                     wrkMast.setPicking("N"); // 拣料 | 
 |  |  |                     wrkMast.setExitMk("N"); // 退出 | 
 |  |  |                     wrkMast.setEmptyMk("N"); // 空板 | 
 |  |  |                     wrkMast.setLinkMis("N"); | 
 |  |  |                     wrkMast.setBarcode(locMast.getBarcode()); | 
 |  |  |                     wrkMast.setAppeUser(userId); // 操作人员数据 | 
 |  |  |                     wrkMast.setAppeTime(now); | 
 |  |  |                     wrkMast.setModiUser(userId); | 
 |  |  |                     wrkMast.setModiTime(now); | 
 |  |  |                     if (!wrkMastService.insert(wrkMast)) { | 
 |  |  |                         throw new CoolException("保存工作档失败,出库库位号:" + dto.getLocNo()); | 
 |  |  |                     } | 
 |  |  |                     // 生成工作档明细 | 
 |  |  |                     for (LocDetl locDetl : locDetlService.selectByLocNo(locMast.getLocNo())) { | 
 |  |  |                         WrkDetl wrkDetl = new WrkDetl(); | 
 |  |  |                         wrkDetl.sync(locDetl); | 
 |  |  |                         wrkDetl.setOrderNo(""); // 手动出库不需要带出库存中的单据编号 | 
 |  |  |                         wrkDetl.setWrkNo(workNo); | 
 |  |  |                         wrkDetl.setIoTime(now); | 
 |  |  |                         wrkDetl.setAnfme(locDetl.getAnfme()); // 数量 | 
 |  |  |                         wrkDetl.setAppeTime(now); | 
 |  |  |                         wrkDetl.setAppeUser(userId); | 
 |  |  |                         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.出库预约 | 
 |  |  |                     if (locMast.getLocSts().equals("F")) { | 
 |  |  |                         locMast.setLocSts("R"); | 
 |  |  |                         locMast.setModiUser(userId); | 
 |  |  |                         locMast.setModiTime(now); | 
 |  |  |                         if (!locMastService.updateById(locMast)) { | 
 |  |  |                             throw new CoolException("预约库位状态失败,库位号:" + dto.getLocNo()); | 
 |  |  |                         } | 
 |  |  |                     } else { | 
 |  |  |                         throw new CoolException(dto.getLocNo() + "库位不是在库状态"); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |             //-----------------2023.5.31上架区域版本兼容代码end----------------------- | 
 |  |  |  | 
 |  |  |             // 判断入出库类型:101.全板出库 or 103.拣料出库 | 
 |  |  |             if (ioWorkType == null) { | 
 |  |  |                 ioType = dto.isAll() ? 101 : 103; | 
 |  |  | 
 |  |  |             assert ioType != null; | 
 |  |  |             // 获取库位 | 
 |  |  |             LocMast locMast = locMastService.selectById(dto.getLocNo()); | 
 |  |  |  | 
 |  |  |             //-----------------2023.6.2出库兼容代码----------------------- | 
 |  |  |             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----------------------- | 
 |  |  |  | 
 |  |  |             // 获取路径 | 
 |  |  |             StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), staNo.getDevNo(), locMast.getRow1()); | 
 |  |  |             if(staDesc == null){ | 
 |  |  | 
 |  |  |                 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("保存工作档明细失败"); | 
 |  |  |             } | 
 |  |  | 
 |  |  |             locSts = "O"; | 
 |  |  |  | 
 |  |  |             // 库位转移 | 
 |  |  |             if (wrkMast.getIoType() == 11) { | 
 |  |  |             if (wrkMast.getIoType() == 11 || wrkMast.getIoType() == 111) { | 
 |  |  |                 // 库位转移:源库位 | 
 |  |  |                 LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo()); | 
 |  |  |                 if (Cools.isEmpty(locMast)) { | 
 |  |  | 
 |  |  |                     wrkDetl.setAppeUser(9527L); | 
 |  |  |                     wrkDetl.setModiTime(now); | 
 |  |  |                     wrkDetl.setModiUser(9527L); | 
 |  |  |                     wrkDetl.setMatType(locDetl.getMatType()); | 
 |  |  |                     if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                         throw new CoolException("保存工作档明细失败"); | 
 |  |  |                     } |