|  |  | 
 |  |  |     @Autowired | 
 |  |  |     private WcsController wcsController; | 
 |  |  |     @Autowired | 
 |  |  |     private WaitPakinService waitPakinService; | 
 |  |  |     @Autowired | 
 |  |  |     private RowLastnoService rowLastnoService; | 
 |  |  |     @Autowired | 
 |  |  |     private SlaveProperties slaveProperties; | 
 |  |  | 
 |  |  |         // 检索库位 | 
 |  |  |         LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo); | 
 |  |  |         List<String> matnrs = param.getList().stream().map(FullStoreParam.MatCodeStore::getMatnr).distinct().collect(Collectors.toList()); | 
 |  |  |         StartupDto dto = commonService.getLocNo(DEFAULT_ROW_NO_TYPE, 1, param.getDevpNo(), matnrs, locTypeDto, 0); | 
 |  |  |         StartupDto dto = commonService.getLocNo(DEFAULT_ROW_NO_TYPE, 1, param.getDevpNo(), matnrs, locTypeDto); | 
 |  |  |         // 生成工作号 | 
 |  |  |         int workNo = dto.getWorkNo(); | 
 |  |  |         // 生成工作档 | 
 |  |  | 
 |  |  |     @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())); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if (!locDetlDtos.isEmpty()) { | 
 |  |  |             // 启动出库开始 101.出库 | 
 |  |  |             stockOut(staNo, locDetlDtos, null, userId); | 
 |  |  |             LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlDtos.get(0).getLocDetl().getLocNo())); | 
 |  |  |             if (locMast.getLocSts().equals("F") || locMast.getLocSts().equals("D") ){ | 
 |  |  |                 // 启动出库开始 101.出库 | 
 |  |  |                 stockOut(staNo, locDetlDtos, null, userId); | 
 |  |  |             }else { | 
 |  |  |                 throw new CoolException("所选库位存在状态不为F、D的库位,库位号:"+locMast.getLocNo()+" 、当前状态:"+locMast.getLocSts()+"-"+locMast.getLocSts$()); | 
 |  |  |             } | 
 |  |  |         } 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()); | 
 |  |  |             StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), staNo.getDevNo(), locMast.getRow1()); | 
 |  |  |             if(staDesc == null){ | 
 |  |  |                 throw new CoolException("出库路径不存在"); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 生成工作号 | 
 |  |  |             int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); | 
 |  |  |             // 生成工作档 | 
 |  |  | 
 |  |  |             wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID | 
 |  |  |             wrkMast.setIoType(ioType); // 入出库状态 | 
 |  |  |             Double ioPri = wrkMastService.getIoPri(ioType, dto.getLocNo()); | 
 |  |  |             wrkMast.setIoPri(13D); // 优先级:13 | 
 |  |  |             wrkMast.setIoPri(15D); // 优先级:13 | 
 |  |  |             wrkMast.setOutMost(locMastService.isOutMost(dto.getLocNo(), false) ? 1 : 0); | 
 |  |  |             wrkMast.setCrnNo(locMast.getCrnNo()); | 
 |  |  |             wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站 | 
 |  |  | 
 |  |  |                 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("保存工作档明细失败"); | 
 |  |  |             } | 
 |  |  |             // 修改订单明细 | 
 |  |  |             if (BaseController.isJSON(locDto.getOrderNo())) { | 
 |  |  |             if (!BaseController.isJSON(locDto.getOrderNo())) { | 
 |  |  |                 String[] orderNos = GetOrderNo(locDto.getOrderNo()); | 
 |  |  |                 if (!Cools.isEmpty(orderNos)){ | 
 |  |  |                     Double anfme = locDto.getAnfme(); | 
 |  |  | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |                 // 订单合并出库 | 
 |  |  | //                List<OrderDto> orderDtoList = JSON.parseArray(locDto.getOrderNo(), OrderDto.class); | 
 |  |  |                 List<OrderDto> orderDtoList = new ArrayList<>(); | 
 |  |  |                 orderDtoList.add(new OrderDto(locDto.getOrderNo(),locDto.getMatnr(),locDto.getAnfme())); | 
 |  |  |                 List<OrderDto> orderDtoList = JSON.parseArray(locDto.getOrderNo(), OrderDto.class); | 
 |  |  |  | 
 |  |  |                 for (OrderDto orderDto : orderDtoList) { | 
 |  |  |                     OrderDetl orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch()); | 
 |  |  |                     if (orderDetl == null) { | 
 |  |  | 
 |  |  |         BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true); | 
 |  |  |         // 检索库位 | 
 |  |  |         LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo); | 
 |  |  |         StartupDto dto = commonService.getLocNo(DEFAULT_ROW_NO_TYPE, 10, devpNo, null, locTypeDto, 0); | 
 |  |  |         StartupDto dto = commonService.getLocNo(DEFAULT_ROW_NO_TYPE, 10, devpNo, null, locTypeDto); | 
 |  |  |         int workNo = dto.getWorkNo(); | 
 |  |  |         // 生成工作档 | 
 |  |  |         WrkMast wrkMast = new WrkMast(); | 
 |  |  | 
 |  |  |             if (Cools.isEmpty(locMast)) { | 
 |  |  |                 throw new CoolException(locNo + "库位不存在"); | 
 |  |  |             } | 
 |  |  |             if (!locMast.getLocSts().equals("D")){ | 
 |  |  |                 throw new CoolException("所选库位存在状态不为D的库位,库位号:"+locMast.getLocNo()+" 、当前状态:"+locMast.getLocSts()+"-"+locMast.getLocSts$()); | 
 |  |  |             } | 
 |  |  |             // 获取源站 | 
 |  |  |             Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() | 
 |  |  |                     .eq("type_no", 110) | 
 |  |  | 
 |  |  |     @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()); | 
 |  |  |         // 获取库位明细 | 
 |  |  | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if (!locDetlDtos.isEmpty()) { | 
 |  |  |             // 启动出库开始 107.盘点出库 | 
 |  |  |             stockOut(staNo, locDetlDtos, IoWorkType.CHECK_OUT, userId); | 
 |  |  |             LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlDtos.get(0).getLocDetl().getLocNo())); | 
 |  |  |             if (locMast.getLocSts().equals("F")){ | 
 |  |  |                 // 启动出库开始 107.盘点出库 | 
 |  |  |                 stockOut(staNo, locDetlDtos, IoWorkType.CHECK_OUT, userId); | 
 |  |  |             }else { | 
 |  |  |                 throw new CoolException("所选库位存在状态不为F的库位,库位号:"+locMast.getLocNo()+" 、当前状态:"+locMast.getLocSts()+"-"+locMast.getLocSts$()); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } else { | 
 |  |  |             throw new CoolException("库位物料不存在"); | 
 |  |  |         } | 
 |  |  | 
 |  |  |         LocMast loc = locMastService.selectById(locNo); | 
 |  |  |         if (Cools.isEmpty(loc)) { | 
 |  |  |             throw new CoolException("未找到库位"); | 
 |  |  |         } | 
 |  |  |         if (!loc.getLocSts().equals("O")||(!sourceLoc.getLocSts().equals("F") && !sourceLoc.getLocSts().equals("D"))){ | 
 |  |  |             throw new CoolException("库位状态已改变"); | 
 |  |  |         } | 
 |  |  |         if (!sourceLoc.getCrnNo().equals(loc.getCrnNo())) { | 
 |  |  | //            throw new CoolException("移转库位属于不同堆垛机");   todo:luxiaotao | 
 |  |  | 
 |  |  |             wrkDetl.setAppeUser(userId); | 
 |  |  |             wrkDetl.setModiTime(now); | 
 |  |  |             wrkDetl.setModiUser(userId); | 
 |  |  |             wrkDetl.setMatType(locDetl.getMatType()); | 
 |  |  |             if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                 throw new CoolException("保存工作档明细失败"); | 
 |  |  |             } | 
 |  |  | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 if (locDetl.getMatnr().equals(adjust.getMatnr()) && Cools.eq(locDetl.getBatch(), adjust.getBatch())) { | 
 |  |  |                     if (!locDetl.getAnfme().equals(adjust.getCount())) { | 
 |  |  |                         // todo 盘点记录 | 
 |  |  |                         // 修改库存 | 
 |  |  |                         if (!locDetlService.updateAnfme(adjust.getCount(), locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch())) { | 
 |  |  |                             throw new CoolException(locDetl.getLocNo() + "库位," + locDetl.getMatnr() + "商品," + locDetl.getBatch() + "序列码修改数量失败"); | 
 |  |  |                         } | 
 |  |  |                         // 保存调整记录 | 
 |  |  |                         AdjDetl adjDetl = new AdjDetl(); | 
 |  |  |                         adjDetl.setLocNo(locDetl.getLocNo()); | 
 |  |  |                         adjDetl.setMatnr(locDetl.getMatnr()); | 
 |  |  |                         adjDetl.setBatch(locDetl.getBatch()); | 
 |  |  |                         adjDetl.setOriQty(locDetl.getAnfme()); | 
 |  |  |                         adjDetl.setAdjQty(adjust.getCount()); | 
 |  |  |                         adjDetl.setModiTime(now); | 
 |  |  |                         adjDetl.setModiUser(userId); | 
 |  |  |                         adjDetl.setAppeTime(now); | 
 |  |  |                         adjDetl.setAppeUser(userId); | 
 |  |  |                         adjDetlService.save(adjDetl, userId); | 
 |  |  |                     // todo 盘点记录 | 
 |  |  |                     // 修改库存 | 
 |  |  |                     if (!locDetlService.updateAnfme(adjust.getCount(), locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), adjust.getManu(), adjust.getMemo())) { | 
 |  |  |                         throw new CoolException(locDetl.getLocNo() + "库位," + locDetl.getMatnr() + "商品," + locDetl.getBatch() + "序列码修改数量失败"); | 
 |  |  |                     } | 
 |  |  |                     // 保存调整记录 | 
 |  |  |                     AdjDetl adjDetl = new AdjDetl(); | 
 |  |  |                     adjDetl.setLocNo(locDetl.getLocNo()); | 
 |  |  |                     adjDetl.setMatnr(locDetl.getMatnr()); | 
 |  |  |                     adjDetl.setBatch(locDetl.getBatch()); | 
 |  |  |                     adjDetl.setOriQty(locDetl.getAnfme()); | 
 |  |  |                     adjDetl.setAdjQty(adjust.getCount()); | 
 |  |  |                     adjDetl.setMemo(adjust.getMemo()); | 
 |  |  |                     adjDetl.setManu(adjust.getManu()); | 
 |  |  |                     adjDetl.setModiTime(now); | 
 |  |  |                     adjDetl.setModiUser(userId); | 
 |  |  |                     adjDetl.setAppeTime(now); | 
 |  |  |                     adjDetl.setAppeUser(userId); | 
 |  |  |                     adjDetlService.save(adjDetl, userId); | 
 |  |  |  | 
 |  |  |                     iterator.remove(); | 
 |  |  |                     iterator1.remove(); | 
 |  |  |                 } | 
 |  |  | 
 |  |  |             locDetl.setBatch(adjust.getBatch()); | 
 |  |  |             locDetl.setLocNo(locMast.getLocNo()); | 
 |  |  |             locDetl.setAnfme(adjust.getCount()); // 数量 | 
 |  |  |             locDetl.setMemo(adjust.getMemo()); | 
 |  |  |             locDetl.setManu(adjust.getManu()); | 
 |  |  |             locDetl.setModiUser(userId); // 操作人员信息 | 
 |  |  |             locDetl.setModiTime(now); | 
 |  |  |             locDetl.setAppeUser(userId); | 
 |  |  | 
 |  |  |             adjDetl.setLocNo(locMast.getLocNo()); | 
 |  |  |             adjDetl.setMatnr(adjust.getMatnr()); | 
 |  |  |             adjDetl.setBatch(adjust.getBatch()); | 
 |  |  |             adjDetl.setMemo(adjust.getMemo()); | 
 |  |  |             adjDetl.setManu(adjust.getManu()); | 
 |  |  |             adjDetl.setOriQty(0.0D); | 
 |  |  |             adjDetl.setAdjQty(adjust.getCount()); | 
 |  |  |             adjDetl.setModiTime(now); | 
 |  |  | 
 |  |  |             locSts = "O"; | 
 |  |  |  | 
 |  |  |             // 库位转移 | 
 |  |  |             if (wrkMast.getIoType() == 11) { | 
 |  |  |             if (wrkMast.getIoType() == 11 || wrkMast.getIoType() == 111) { | 
 |  |  |                 // 库位转移:源库位 | 
 |  |  |                 LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo()); | 
 |  |  |                 if (Cools.isEmpty(locMast)) { | 
 |  |  | 
 |  |  |                 locSts = "D"; | 
 |  |  |                 // 库位转移 ===>> D.空桶/空栈板 | 
 |  |  |             } else if (wrkMast.getIoType() == 11) { | 
 |  |  |                 if (wrkMast.getWrkSts() > 11){ | 
 |  |  |                     throw new CoolException("移库任务已在执行中,不能取消"); | 
 |  |  |                 } | 
 |  |  |                 locSts = wrkMast.getFullPlt().equalsIgnoreCase("N") ? "D" : "F"; | 
 |  |  |                 // 库位转移:目标库位 | 
 |  |  |                 LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); | 
 |  |  | 
 |  |  |                         if (!Cools.isEmpty(orderNo)) { | 
 |  |  |                             Double anfme = Integer.parseInt(anfmes[i]) + 0.0; | 
 |  |  |                             i++; | 
 |  |  |                             if (BaseController.isJSON(wrkDetl.getOrderNo())) { | 
 |  |  |                             if (!BaseController.isJSON(wrkDetl.getOrderNo())) { | 
 |  |  |                                 if (!orderDetlService.decrease(orderNo, wrkDetl.getMatnr(), wrkDetl.getBatch(), anfme)) { | 
 |  |  |                                     throw new CoolException("订单数据回滚失败"); | 
 |  |  |                                 } | 
 |  |  | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 }else { | 
 |  |  |                     if (BaseController.isJSON(wrkDetl.getOrderNo())) { | 
 |  |  |                     if (!BaseController.isJSON(wrkDetl.getOrderNo())) { | 
 |  |  |                         if (!orderDetlService.decrease(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme())) { | 
 |  |  |                             throw new CoolException("订单数据回滚失败"); | 
 |  |  |                         } | 
 |  |  | 
 |  |  |                     wrkDetl.setAppeUser(9527L); | 
 |  |  |                     wrkDetl.setModiTime(now); | 
 |  |  |                     wrkDetl.setModiUser(9527L); | 
 |  |  |                     wrkDetl.setMatType(locDetl.getMatType()); | 
 |  |  |                     if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                         throw new CoolException("保存工作档明细失败"); | 
 |  |  |                     } |