src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -193,27 +193,24 @@ String locNo = String.format("%02d", r) + String.format("%03d", b) + String.format("%02d", l); // 获取堆垛机号 int crnNo = 0; if (basWhs.getIdentifying().equals("1") || basWhs.getIdentifying().equals("3")){ try{ Shelves shelves = new Shelves(param.getEndRow() - param.getStartRow() + 1, param.getCrnAmount(),param.getStartRow()); for (List<Integer> node : shelves.nodes){ try{ Shelves shelves = new Shelves(param.getEndRow() - param.getStartRow() + 1, param.getCrnAmount(),param.getStartRow()); for (List<Integer> node : shelves.nodes){ if (node.contains(r)) { if (!Cools.isEmpty(param.getStaCrn()) && param.getStaCrn() > 0){ crnNo = shelves.nodes.indexOf(node) + param.getStaCrn(); }else { crnNo = shelves.nodes.indexOf(node) + 1; } break; if (node.contains(r)) { if (!Cools.isEmpty(param.getStaCrn()) && param.getStaCrn() > 0){ crnNo = shelves.nodes.indexOf(node) + param.getStaCrn(); }else { crnNo = shelves.nodes.indexOf(node) + 1; } break; } }catch (Exception e){ throw new Exception("解析堆垛机号失败,请填写正确的数据!!!"); } }else { crnNo = param.getStaCrn(); }catch (Exception e){ throw new Exception("解析堆垛机号失败,请填写正确的数据!!!"); } Date now = new Date(); LocMast locMast = new LocMast(); locMast.setLocNo(locNo); @@ -221,7 +218,7 @@ locMast.setRow1(r); // 排 locMast.setBay1(b); // 列 locMast.setLev1(l); // 层 locMast.setGro1(0); // 组 locMast.setGro1(r); // 组 locMast.setCrnNo(crnNo); // 堆垛机 locMast.setLocType1(!Cools.isEmpty(param.getLocType1()) ? param.getLocType1() : 1); locMast.setLocType2(param.getLocType2()); src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -29,20 +29,28 @@ /* * 获取目标库位所在巷道最浅非空库位 深>浅 * */ LocMast selectLocByLocStsPakInF1(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType); // LocMast selectLocByLocStsPakInF1(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType); LocMast selectLocByLocStsPakInF1(@Param("crnNo") Integer crnNo,@Param("bay") Integer bay,@Param("lev") Integer lev,@Param("gro") Integer gro,@Param("whsType") Long whsType); /* * 获取目标库位所在巷道最浅非空库位 深<浅 * */ LocMast selectLocByLocStsPakInF2(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType); // LocMast selectLocByLocStsPakInF2(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType); LocMast selectLocByLocStsPakInF2(@Param("crnNo") Integer crnNo,@Param("bay") Integer bay,@Param("lev") Integer lev,@Param("gro") Integer gro,@Param("whsType") Long whsType); /* * 获取目标库位所在巷道最深空库位 深>浅 * */ LocMast selectLocByLocStsPakInO1(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType); // LocMast selectLocByLocStsPakInO1(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType); LocMast selectLocByLocStsPakInO1(@Param("crnNo") Integer crnNo,@Param("bay") Integer bay,@Param("lev") Integer lev,@Param("gro") Integer gro,@Param("whsType") Long whsType); /* * 获取目标库位所在巷道最深空库位 深<浅 * */ LocMast selectLocByLocStsPakInO2(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType); // LocMast selectLocByLocStsPakInO2(@Param("locNos") List<String> locNos,@Param("whsType") Long whsType); LocMast selectLocByLocStsPakInO2(@Param("crnNo") Integer crnNo,@Param("bay") Integer bay,@Param("lev") Integer lev,@Param("gro") Integer gro,@Param("whsType") Long whsType); } src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.mapper.BaseMapper; import com.zy.asrs.entity.WrkMast; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; @@ -20,4 +21,6 @@ @Select("select count(1) from asr_wrk_mast where 1=1 and io_type = #{ioType} and sta_no = #{staNo}") int selectWrkMastBareBoardStaNo(Integer ioType,Integer staNo); List<WrkMast> selectWrkMastWrkDetlMatnrBatch(@Param("ioType") Integer ioType, @Param("matnr") String matnr , @Param("batch") String batch , @Param("grade") String grade , @Param("crnNo") Integer crnNo); } src/main/java/com/zy/asrs/service/LocMastService.java
@@ -50,12 +50,14 @@ /* * 获取目标库位所在巷道最浅非空库位 * */ LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos); LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos, Long whsType); // LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos); // LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos, Long whsType); LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,LocMast locNo, Long whsType); /* * 获取目标库位所在巷道最深空库位 * */ LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos); LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos, Long whsType); // LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos); // LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos, Long whsType); LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,LocMast locNoo, Long whsType); } src/main/java/com/zy/asrs/service/WrkMastService.java
@@ -23,4 +23,7 @@ int getStoreCount(Integer crnNo); int selectWrkMastBareBoardStaNo(Integer ioType,Integer staNo); List<WrkMast> selectWrkMastWrkDetlMatnrBatch(Integer ioType,String matnr , String batch ,String grade,Integer crnNo); } src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -71,38 +71,46 @@ /* *获取目标库位所在巷道最浅非空库位 * */ @Override public LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos) { if (curRow<nearRow){ return this.baseMapper.selectLocByLocStsPakInF1(locNos,1L); } return this.baseMapper.selectLocByLocStsPakInF2(locNos,1L); } // @Override // public LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos) { // if (curRow<nearRow){ // return this.baseMapper.selectLocByLocStsPakInF1(locNos,1L); // } // return this.baseMapper.selectLocByLocStsPakInF2(locNos,1L); // } // // @Override // public LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos,Long type) { // if (curRow<nearRow){ // return this.baseMapper.selectLocByLocStsPakInF1(locNos,type); // } // return this.baseMapper.selectLocByLocStsPakInF2(locNos,type); // } @Override public LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos,Long type) { public LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,LocMast locMast,Long type) { if (curRow<nearRow){ return this.baseMapper.selectLocByLocStsPakInF1(locNos,type); return this.baseMapper.selectLocByLocStsPakInF1(locMast.getCrnNo(),locMast.getBay1(),locMast.getLev1(),locMast.getGro1(),type); } return this.baseMapper.selectLocByLocStsPakInF2(locNos,type); return this.baseMapper.selectLocByLocStsPakInF2(locMast.getCrnNo(),locMast.getBay1(),locMast.getLev1(),locMast.getGro1(),type); } /* * 获取目标库位所在巷道最深空库位 * */ // @Override // public LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos) { // if (curRow<nearRow){ // return this.baseMapper.selectLocByLocStsPakInO1(locNos,1L); // } // return this.baseMapper.selectLocByLocStsPakInO2(locNos,1L); // } @Override public LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos) { public LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,LocMast locMast,Long type) { if (curRow<nearRow){ return this.baseMapper.selectLocByLocStsPakInO1(locNos,1L); return this.baseMapper.selectLocByLocStsPakInO1(locMast.getCrnNo(),locMast.getBay1(),locMast.getLev1(),locMast.getGro1(),type); } return this.baseMapper.selectLocByLocStsPakInO2(locNos,1L); } @Override public LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos,Long type) { if (curRow<nearRow){ return this.baseMapper.selectLocByLocStsPakInO1(locNos,type); } return this.baseMapper.selectLocByLocStsPakInO2(locNos,type); return this.baseMapper.selectLocByLocStsPakInO2(locMast.getCrnNo(),locMast.getBay1(),locMast.getLev1(),locMast.getGro1(),type); } @Override src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
@@ -50,4 +50,8 @@ return this.baseMapper.selectWrkMastBareBoardStaNo(ioType,staNo); } @Override public List<WrkMast> selectWrkMastWrkDetlMatnrBatch(Integer ioType,String matnr , String batch ,String grade ,Integer crnNo) { return this.baseMapper.selectWrkMastWrkDetlMatnrBatch(ioType,matnr,batch,grade,crnNo); } } src/main/java/com/zy/asrs/utils/DigitAndSortUrils.java
New file @@ -0,0 +1,24 @@ package com.zy.asrs.utils; import java.util.Arrays; public class DigitAndSortUrils { public static void main(String[] args) { int[] numbers = {5, 10, 15, 3, 8}; // 假设这是你的一组数字 System.out.println(digitMax(numbers)+":max"); System.out.println(digitMin(numbers)+":min"); } public static Integer digitMax(int[] numbers) { int max = Arrays.stream(numbers).max().getAsInt(); return max; } public static Integer digitMin(int[] numbers) { int min = Arrays.stream(numbers).min().getAsInt(); return min; } } src/main/java/com/zy/asrs/utils/Utils.java
@@ -8,10 +8,12 @@ import com.zy.asrs.entity.LocMast; import com.zy.asrs.entity.RowLastno; import com.zy.asrs.service.RowLastnoService; import com.zy.common.CodeBuilder; import com.zy.common.model.LocDetlDto; import com.zy.common.properties.SlaveProperties; import com.zy.common.service.CommonService; import com.zy.system.service.UserService; import java.text.DecimalFormat; import java.util.ArrayList; @@ -254,26 +256,24 @@ return false; } public static int RowCount(Integer whsType, Integer curRow, Integer crnNumber) { return LocNecessaryParameters(whsType, curRow, crnNumber)[0]; public static int RowCount(RowLastno rowLastno, Integer curRow, Integer crnNumber) { return LocNecessaryParameters(rowLastno, curRow, crnNumber)[0]; } public static int getCurRow(Integer whsType, Integer curRow, Integer crnNumber) { return LocNecessaryParameters(whsType, curRow, crnNumber)[1]; public static int getCurRow(RowLastno rowLastno, Integer curRow, Integer crnNumber) { return LocNecessaryParameters(rowLastno, curRow, crnNumber)[1]; } public static int getCrnNo(Integer whsType, Integer curRow, Integer crnNumber) { return LocNecessaryParameters(whsType, curRow, crnNumber)[2]; public static int getCrnNo(RowLastno rowLastno, Integer curRow, Integer crnNumber) { return LocNecessaryParameters(rowLastno, curRow, crnNumber)[2]; } public static int getNearRow(Integer whsType, Integer curRow, Integer crnNumber) { return LocNecessaryParameters(whsType, curRow, crnNumber)[3]; public static int getNearRow(RowLastno rowLastno, Integer curRow, Integer crnNumber) { return LocNecessaryParameters(rowLastno, curRow, crnNumber)[3]; } //库位排号分配 public static int[] LocNecessaryParameters(Integer whsType, Integer curRow, Integer crnNumber) { RowLastnoService rowLastnoService = SpringUtils.getBean(RowLastnoService.class); RowLastno rowLastno = rowLastnoService.selectById(whsType); public static int[] LocNecessaryParameters(RowLastno rowLastno, Integer curRow, Integer crnNumber) { switch (rowLastno.getTypeId()) { case 1://经典双伸库位 return LocNecessaryParametersDoubleExtension(rowLastno, curRow, crnNumber); //已完善 @@ -285,6 +285,8 @@ return LocNecessaryParametersDoubleExtension4(rowLastno, curRow, crnNumber); //未完善 case 5://双工位单伸库位(4排货架) return LocNecessaryParametersDoubleExtension5(rowLastno, curRow, crnNumber); //已完善 case 6://四向库(牛眼车)eg:光泰四向 return LocNecessaryParametersDoubleExtension6(rowLastno, curRow, crnNumber); //已完善 default: return LocNecessaryParametersMove(rowLastno, curRow, crnNumber);//moveCrnNo } @@ -417,8 +419,8 @@ //经典单双伸库位 左双右单(小双大单) public static int[] LocNecessaryParametersDoubleExtension4(RowLastno rowLastno, Integer curRow, Integer crnNumber) { int[] necessaryParameters = new int[]{0, 0, 0, 0}; Integer sRow = rowLastno.getsRow(); Integer sCrnNo = rowLastno.getsCrnNo(); Integer sRow = rowLastno.getsRow();//起始排号 Integer sCrnNo = rowLastno.getsCrnNo();//起始堆垛机号 necessaryParameters[0] = crnNumber; // 轮询次数 //满板正常入库 if (curRow.equals(crnNumber * 3 + sRow - 1)) { @@ -485,6 +487,53 @@ return necessaryParameters; } //四向库(牛眼\光泰) public static int[] LocNecessaryParametersDoubleExtension6(RowLastno rowLastno, Integer curRow, Integer crnNumber) { int[] necessaryParameters = new int[]{0, 0, 0, 0}; Integer sRow = rowLastno.getsRow();//起始排号 Integer offset = 0;//起始排号 Integer sCrnNo = rowLastno.getsCrnNo();//起始堆垛机号 necessaryParameters[0] = crnNumber; // 轮询次数 curRow = curRow - offset; //满板正常入库 switch (curRow){ case 2: necessaryParameters[1] = 4; //curRow 最深库位排 necessaryParameters[2] = sCrnNo; //crnNo 堆垛机号 necessaryParameters[3] = 7; //nearRow 最浅库位排 break; case 7: necessaryParameters[1] = 9; //curRow 最深库位排 necessaryParameters[2] = sCrnNo; //crnNo 堆垛机号 necessaryParameters[3] = 12; //nearRow 最浅库位排 break; case 12: necessaryParameters[1] = 7; //curRow 最深库位排 necessaryParameters[2] = sCrnNo; //crnNo 堆垛机号 necessaryParameters[3] = 4; //nearRow 最浅库位排 break; case 4: necessaryParameters[1] = 12; //curRow 最深库位排 necessaryParameters[2] = sCrnNo; //crnNo 堆垛机号 necessaryParameters[3] = 9; //nearRow 最浅库位排 break; case 9: necessaryParameters[1] = 14; //curRow 最深库位排 necessaryParameters[2] = sCrnNo; //crnNo 堆垛机号 necessaryParameters[3] = 14; //nearRow 最浅库位排 break; case 14: necessaryParameters[1] = 1; //curRow 最深库位排 necessaryParameters[2] = sCrnNo; //crnNo 堆垛机号 necessaryParameters[3] = 2; //nearRow 最浅库位排 break; default: throw new CoolException("库位排号异常:排号:" + curRow); } necessaryParameters[1] = necessaryParameters[1] + offset; necessaryParameters[3] = necessaryParameters[3] + offset; return necessaryParameters; } public static void main(String[] args) { @@ -548,12 +597,12 @@ // 外侧方向的货位 优先入库方向 ===>> 反之 public static List<String> getGroupOutLocCrn(Integer curRow, Integer nearRow, String locNo, boolean pakin) { List<String> result = new ArrayList<>(); if (pakin) { for (int row = curRow; row <= nearRow; row++) { if (pakin){ for (int row = curRow;row>=nearRow;row--){ result.add(zerofill(String.valueOf(row), 2) + locNo.substring(2)); } } else { for (int row = curRow; row >= curRow; row--) { }else { for (int row = curRow;row<=nearRow;row++){ result.add(zerofill(String.valueOf(row), 2) + locNo.substring(2)); } } src/main/java/com/zy/common/service/CommonService.java
@@ -54,6 +54,8 @@ private LocDetlService locDetlService; @Autowired private SlaveProperties slaveProperties; @Autowired private WrkDetlService wrkDetlService; /** * 生成工作号 @@ -137,7 +139,7 @@ log.error("站点={} 未查询到对应的规则",sourceStaNo); break; case 4: return getLocNoRun(whsType,staDescId,sourceStaNo,matnr,batch,grade,0,locTypeDto,0); return getLocNoRun2(whsType,staDescId,sourceStaNo,matnr,batch,grade,3,locTypeDto,0); case 5: log.error("站点={} 未查询到对应的规则",sourceStaNo); break; @@ -182,14 +184,18 @@ StartupDto startupDto = new StartupDto(); RowLastno rowLastno = rowLastnoService.selectById(whsType); if (Cools.isEmpty(rowLastno)) { throw new CoolException("数据异常,请联系管理员===>库位规则未知"); } RowLastnoType rowLastnoType = rowLastnoTypeService.selectById(rowLastno.getTypeId()); if (Cools.isEmpty(rowLastnoType)) { throw new CoolException("数据异常,请联系管理员===》库位规则类型未知"); } int sRow = rowLastno.getsRow(); int eRow = rowLastno.geteRow(); int crnNumber = rowLastno.getCrnQty(); if (Cools.isEmpty(rowLastno)) { throw new CoolException("数据异常,请联系管理员"); } // ===============>>>> 开始执行 curRow = rowLastno.getCurrentRow(); @@ -204,7 +210,7 @@ //此程序用于优化堆垛机异常时的运行时间 for (int i = times; i < crnNumber*2; i++) { int[] locNecessaryParameters = Utils.LocNecessaryParameters(whsType, curRow, crnNumber); int[] locNecessaryParameters = Utils.LocNecessaryParameters(rowLastno, curRow, crnNumber); curRow = locNecessaryParameters[1]; crnNo = locNecessaryParameters[2]; if (basCrnpService.checkSiteError(crnNo, true)) { @@ -251,14 +257,17 @@ .eq("row1", nearRow).eq("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue())); for (LocMast locMast1:locMasts){ //获取巷道 List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,locMast1.getLocNo(), curRow>nearRow); // List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,locMast1.getLocNo(), curRow>nearRow); // LocMast locMastGro = locMastService.selectById(wrkMast.getLocNo()); //获取目标库位所在巷道最浅非空库位 LocMast locMastF = locMastService.selectLocByLocStsPakInF(curRow,nearRow,groupOutsideLocCrn,rowLastnoType.getType().longValue()); LocMast locMastF = locMastService.selectLocByLocStsPakInF(curRow,nearRow,locMast1,rowLastnoType.getType().longValue()); if (!Cools.isEmpty(locMastF) && locMastF.getLocSts().equals("F")){ LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locMastF.getLocNo())); if (!Cools.isEmpty(locDetl) && matnr.equals(locDetl.getMatnr()) && batch.equals(Cools.isEmpty(locDetl.getBatch()) ? "" : locDetl.getBatch()) && grade.equals(Cools.isEmpty(locDetl.getBrand()) ? "" : locDetl.getBrand())) { //获取目标库位所在巷道最浅非空库位 locMast = locMastService.selectLocByLocStsPakInO(curRow,nearRow,groupOutsideLocCrn,rowLastnoType.getType().longValue()); if (!Cools.isEmpty(locDetl) && matnr.equals(locDetl.getMatnr()) && batch.equals(batch.isEmpty() ? "" : locDetl.getBatch()) && grade.equals(grade.isEmpty() ? "" : locDetl.getBrand())) { //获取目标库位所在巷道最深空库位 locMast = locMastService.selectLocByLocStsPakInO(curRow,nearRow,locMast1,rowLastnoType.getType().longValue()); break; } } @@ -454,4 +463,419 @@ return startupDto; } public StartupDto getLocNoRun2(Integer whsType, Integer staDescId, Integer sourceStaNo, String matnr, String batch, String grade, Integer moveCrnNo, LocTypeDto locTypeDto, int times) { if (Cools.isEmpty(matnr)) { //物料号 matnr = ""; } if (Cools.isEmpty(batch)) { //批次 batch = ""; } if (Cools.isEmpty(grade)) { //备用 grade = ""; } // 初始化参数 int crnNo = 0; //堆垛机号 int nearRow = 0; //最浅库位排 int curRow = 0; //最深库位排 int rowCount = 0; //轮询轮次 LocMast locMast = null; // 目标库位 StartupDto startupDto = new StartupDto(); RowLastno rowLastno = rowLastnoService.selectById(whsType); if (Cools.isEmpty(rowLastno)) { throw new CoolException("数据异常,请联系管理员===>库位规则未知"); } RowLastnoType rowLastnoType = rowLastnoTypeService.selectById(rowLastno.getTypeId()); if (Cools.isEmpty(rowLastnoType)) { throw new CoolException("数据异常,请联系管理员===》库位规则类型未知"); } int sRow = rowLastno.getsRow(); int eRow = rowLastno.geteRow(); int crnNumber = rowLastno.getCrnQty(); // ===============>>>> 开始执行 curRow = rowLastno.getCurrentRow(); if (!Cools.isEmpty(moveCrnNo) && moveCrnNo!=0){ crnNumber = moveCrnNo; // if (times==0){ // curRow = moveCrnNo*4-1; // }else { // curRow = moveCrnNo*4-2; // } } //此程序用于优化堆垛机异常时的运行时间 for (int i = times; i < crnNumber*2; i++) { int[] locNecessaryParameters = Utils.LocNecessaryParameters(rowLastno, curRow, crnNumber); curRow = locNecessaryParameters[1]; crnNo = locNecessaryParameters[2]; if (basCrnpService.checkSiteError(crnNo, true)) { rowCount = locNecessaryParameters[0]; nearRow = locNecessaryParameters[3]; List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>() .eq("crn_no", crnNo).eq("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue())); if (locMasts.size()<=5){ times++; continue; } break; } else { times++; } } if (crnNo == 0) { throw new CoolException("无可用库位"); } // 相似工作档案 --- 同天同规格物料 if (!Cools.isEmpty(matnr) && (staDescId == 1 || staDescId == 11 || staDescId == 111) ) { //查询相似工作档案 List<WrkMast> wrkMasts = wrkMastService.selectWrkMastWrkDetlMatnrBatch(staDescId, matnr, batch,grade, crnNo); int nearbay = 0; //相似工作档案 目标库位列 int nearlev = 0; //相似工作档案 目标库位层 for (WrkMast wrkMast:wrkMasts){ if (Cools.isEmpty(wrkMast.getLocNo())){ continue; } //目标排为最外层排 if (Utils.getRow(wrkMast.getLocNo())==nearRow){ continue; } //起始站不一致 if (!wrkMast.getSourceStaNo().equals(sourceStaNo)){ continue; } //相同列、层过滤 if (Utils.getBay(wrkMast.getLocNo())==nearbay && Utils.getLev(wrkMast.getLocNo())==nearlev){ continue; }else { nearbay=Utils.getBay(wrkMast.getLocNo()); nearlev=Utils.getLev(wrkMast.getLocNo()); } //获取目标库位所在巷道并排序 // List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,wrkMast.getLocNo(), curRow>nearRow); LocMast locMastGro = locMastService.selectById(wrkMast.getLocNo()); //获取目标库位所在巷道最浅非空库位 LocMast locMast2 = locMastService.selectLocByLocStsPakInF(curRow,nearRow,locMastGro,rowLastnoType.getType().longValue()); //目标库位所在巷道最浅非空库位存在&&非最外侧库位&&入库状态 if (!Cools.isEmpty(locMast2) && Utils.getRow(locMast2.getLocNo())!=nearRow && (locMast2.getLocSts().equals("S") || locMast2.getLocSts().equals("Q"))){ //获取库存明细 WrkDetl wrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo())); //判断同规格物料 if (!Cools.isEmpty(wrkDetl) && matnr.equals(wrkDetl.getMatnr()) && batch.equals(batch.isEmpty() ? "":wrkDetl.getBatch()) && grade.equals(grade.isEmpty()? "":wrkDetl.getBrand())){ int row2=0; if (Utils.getRow(locMast2.getLocNo())>nearRow){ row2=Utils.getRow(locMast2.getLocNo())-1; } else { row2=Utils.getRow(locMast2.getLocNo())+1; } String targetLocNo = zerofill(String.valueOf(row2), 2) + locMast2.getLocNo().substring(2); locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",targetLocNo)); break; } } } } // 相似工作档 --- 空托 if (Cools.isEmpty(locMast) && staDescId == 10) { List<WrkMast> wrkMasts =wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type",10).eq("crn_no",crnNo).eq("whs_type",rowLastnoType.getType().longValue())); int nearbay = 0; int nearlev = 0; for (WrkMast wrkMast:wrkMasts){ if (Cools.isEmpty(wrkMast.getLocNo())){ continue; } if (Utils.getRow(wrkMast.getLocNo())==nearRow){ continue; } //起始站不一致 if (!wrkMast.getSourceStaNo().equals(sourceStaNo)){ continue; } if (Utils.getBay(wrkMast.getLocNo())==nearbay && Utils.getLev(wrkMast.getLocNo())==nearlev){ continue; }else { nearbay=Utils.getBay(wrkMast.getLocNo()); nearlev=Utils.getLev(wrkMast.getLocNo()); } // List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,wrkMast.getLocNo(), curRow>nearRow); LocMast locMastGro = locMastService.selectById(wrkMast.getLocNo()); LocMast locMast2 = locMastService.selectLocByLocStsPakInF(curRow,nearRow,locMastGro,rowLastnoType.getType().longValue()); if (!Cools.isEmpty(locMast2) && Utils.getRow(locMast2.getLocNo())!=nearRow && locMast2.getLocSts().equals("S")){ int row2=0; if (Utils.getRow(locMast2.getLocNo())>nearRow){ row2=Utils.getRow(locMast2.getLocNo())-1; }else { row2=Utils.getRow(locMast2.getLocNo())+1; } String targetLocNo = zerofill(String.valueOf(row2), 2) + locMast2.getLocNo().substring(2); locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",targetLocNo)); break; } } } boolean signRule1 = false; boolean signRule2 = false; if (Utils.BooleanWhsTypeStaIoType(rowLastno)){ // 靠近摆放规则 --- 同天同规格物料 //分离版 if (!Cools.isEmpty(matnr) && staDescId == 1){ signRule1 = true; } // 靠近摆放规则 --- 同天同规格物料 //互通版 if (!Cools.isEmpty(matnr) && staDescId == 1) { signRule2 = true; } if (!Cools.isEmpty(matnr) && (staDescId == 11 || staDescId == 111)) { signRule1 = true; } } if (signRule1){ if (nearRow!=curRow){ List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>() .eq("row1", nearRow).eq("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue())); for (LocMast locMast1:locMasts){ //获取巷道 // List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,locMast1.getLocNo(), curRow>nearRow); //获取目标库位所在巷道最浅非空库位 LocMast locMastF = locMastService.selectLocByLocStsPakInF(curRow,nearRow,locMast1,rowLastnoType.getType().longValue()); if (!Cools.isEmpty(locMastF) && locMastF.getLocSts().equals("F")){ LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locMastF.getLocNo())); if (!Cools.isEmpty(locDetl) && matnr.equals(locDetl.getMatnr()) && batch.equals(batch.isEmpty() ? "" : locDetl.getBatch()) && grade.equals(grade.isEmpty() ? "" : locDetl.getBrand())) { //获取目标库位所在巷道最深空库位 locMast = locMastService.selectLocByLocStsPakInO(curRow,nearRow,locMast1,rowLastnoType.getType().longValue()); break; } } } } }else if (signRule2){ List<String> locNos = locDetlService.getSameDetlToday(matnr, sRow, eRow); for (String locNo : locNos) { if (Utils.isShallowLoc(slaveProperties, locNo)) { continue; } String shallowLocNo = Utils.getShallowLoc(slaveProperties, locNo); // 检测目标库位是否为空库位 LocMast shallowLoc = locMastService.selectById(shallowLocNo); if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) { if (VersionUtils.locMoveCheckLocTypeComplete(shallowLoc, locTypeDto)) { if (basCrnpService.checkSiteError(shallowLoc.getCrnNo(), true)) { locMast = shallowLoc; crnNo = locMast.getCrnNo(); break; } } } } } // 靠近摆放规则 --- 空托 //分离版 if (staDescId == 10 && Utils.BooleanWhsTypeStaIoType(rowLastno)) { List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow).eq("loc_sts", "O")); for (LocMast locMast1:locMasts){ //获取巷道 // List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,locMast1.getLocNo(), curRow>nearRow); //获取目标库位所在巷道最浅非空库位 LocMast locMastF = locMastService.selectLocByLocStsPakInF(curRow,nearRow,locMast1,rowLastnoType.getType().longValue()); if (!Cools.isEmpty(locMastF) && locMastF.getLocSts().equals("D")){ //获取目标库位所在巷道最浅非空库位 locMast = locMastService.selectLocByLocStsPakInO(curRow,nearRow,locMast1,rowLastnoType.getType().longValue()); break; } } } // // 靠近摆放规则 --- 空托 //互通版 // if (staDescId == 10 && Utils.BooleanWhsTypeStaIoType(whsType)) { // List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "D").ge("row1", sRow).le("row1", eRow)); // if (locMasts.size() > 0) { // for (LocMast loc : locMasts) { // if (Utils.isShallowLoc(slaveProperties, loc.getLocNo())) { // continue; // } // String shallowLocNo = Utils.getShallowLoc(slaveProperties, loc.getLocNo()); // // 检测目标库位是否为空库位 // LocMast shallowLoc = locMastService.selectById(shallowLocNo); // if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) { // if (VersionUtils.locMoveCheckLocTypeComplete(shallowLoc, locTypeDto)) { // if (basCrnpService.checkSiteError(shallowLoc.getCrnNo(), true)) { // locMast = shallowLoc; // crnNo = locMast.getCrnNo(); // break; // } // } // } // } // } // } Wrapper<StaDesc> wrapper = null; StaDesc staDesc = null; BasDevp staNo = null; if (Utils.BooleanWhsTypeSta(rowLastno, staDescId)) { // 获取目标站 wrapper = new EntityWrapper<StaDesc>() .eq("type_no", staDescId) .eq("stn_no", sourceStaNo) .eq("crn_no", crnNo); staDesc = staDescService.selectOne(wrapper); if (Cools.isEmpty(staDesc)) { log.error("type_no={},stn_no={},crn_no={}", staDescId, sourceStaNo, crnNo); // throw new CoolException("入库路径不存在"); crnNo = 0; }else { staNo = basDevpService.selectById(staDesc.getCrnStn()); if (!staNo.getAutoing().equals("Y")) { log.error("目标站"+staDesc.getCrnStn()+"不可用"); // throw new CoolException("目标站"+staDesc.getCrnStn()+"不可用"); crnNo = 0; } startupDto.setStaNo(staNo.getDevNo()); } } // 更新库位排号 if (Utils.BooleanWhsTypeSta(rowLastno, staDescId) && Cools.isEmpty(locMast)) { rowLastno.setCurrentRow(curRow); rowLastnoService.updateById(rowLastno); } // 开始查找库位 ==============================>> // 1.按规则查找库位 if (Cools.isEmpty(locMast) && crnNo != 0) { List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>() .eq("row1", nearRow) .eq("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue()) .orderBy("lev1",true).orderBy("bay1",true));//最浅库位 for (LocMast locMast1 : locMasts) { if (!VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) { continue; } if (Utils.BooleanWhsTypeStaIoType(rowLastno)){ // String shallowLoc = Utils.getDeepLocYTl(slaveProperties, locMast1.getLocNo()); // LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>() // .eq("loc_no", shallowLoc).eq("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue())); //获取目标库位所在巷道最深空库位 LocMast locMast2 = locMastService.selectLocByLocStsPakInO(curRow,nearRow,locMast1,rowLastnoType.getType().longValue()); if (!Cools.isEmpty(locMast2) && locMast2.getBay1()==curRow) { locMast = locMast2; break; } } } //未找到 允许混料 if (Cools.isEmpty(locMast) && Utils.BooleanWhsTypeStaIoType(rowLastno)){ for (LocMast locMast1 : locMasts) { if (!VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) { continue; } if (Utils.BooleanWhsTypeStaIoType(rowLastno)){ //获取目标库位所在巷道并排序 // List<String> groupOutsideLocCrn = Utils.getGroupOutLocCrn(curRow,nearRow,locMast1.getLocNo(), curRow>nearRow); //获取目标库位所在巷道最浅非空库位 LocMast locMast2 = locMastService.selectLocByLocStsPakInF(curRow,nearRow,locMast1,rowLastnoType.getType().longValue()); if (Cools.isEmpty(locMast2)) { LocMast locMast3 = locMastService.selectLocByLocStsPakInO(curRow,nearRow,locMast1,rowLastnoType.getType().longValue()); if (!Cools.isEmpty(locMast3)) { locMast = locMast3; break; } } else { if ((locMast2.getLocSts().equals("F") && staDescId == 1) || (locMast2.getLocSts().equals("D") && staDescId == 10)){ LocMast locMast3 = locMastService.selectLocByLocStsPakInO(curRow,nearRow,locMast1,rowLastnoType.getType().longValue()); if (!Cools.isEmpty(locMast3)) { locMast = locMast3; break; } } } } } } // //未找到 找第一排 // if (Cools.isEmpty(locMast) && Utils.BooleanWhsTypeStaIoType(rowLastno)){ // locMasts = locMastService.selectList(new EntityWrapper<LocMast>() // .eq("row1", 1) // .eq("loc_sts", "O") // .orderBy("lev1",true).orderBy("bay1",true)); // for (LocMast locMast1 : locMasts) { // if (!VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) { // continue; // } // locMast = locMast1; // break; // } // } } if (!Cools.isEmpty(locMast) && !basCrnpService.checkSiteError(crnNo, true)) { locMast = null; } // 递归查询 if (Cools.isEmpty(locMast) || !locMast.getLocSts().equals("O")) { // 当前巷道无空库位时,递归调整至下一巷道,检索全部巷道无果后,跳出递归 if (times < rowCount*2) { times = times + 1; return getLocNoRun(whsType, staDescId, sourceStaNo, matnr, batch, grade,moveCrnNo, locTypeDto, times); } // // 2.库位当前所属尺寸无空库位时,调整尺寸参数,向上兼容检索库位 // if (locTypeDto.getLocType1() < 2) { // int i = locTypeDto.getLocType1() + 1; // locTypeDto.setLocType1((short)i); // return getLocNo(1, staDescId, sourceStaNo, matnr,batch,grade, locTypeDto, 0); // } log.error("系统没有空库位!!! 尺寸规格: {}, 轮询次数:{}", JSON.toJSONString(locTypeDto), times); throw new CoolException("没有空库位"); } String locNo = locMast.getLocNo(); // 生成工作号 int workNo = getWorkNo(0); // 返回dto startupDto.setWorkNo(workNo); startupDto.setCrnNo(crnNo); startupDto.setSourceStaNo(sourceStaNo); startupDto.setLocNo(locNo); return startupDto; } public static String zerofill(String msg, Integer count) { if (msg.length() == count) { return msg; } else if (msg.length() > count) { return msg.substring(0, 16); } else { StringBuilder msgBuilder = new StringBuilder(msg); for(int i = 0; i < count - msg.length(); ++i) { msgBuilder.insert(0, "0"); } return msgBuilder.toString(); } } } src/main/resources/mapper/LocMastMapper.xml
@@ -102,51 +102,94 @@ order by row1 desc </select> <!-- <select id="selectLocByLocStsPakInF1" resultMap="BaseResultMap">--> <!-- SELECT top 1 *--> <!-- FROM [dbo].[asr_loc_mast]--> <!-- WHERE 1=1--> <!-- and whs_type=#{whsType}--> <!-- and loc_no in--> <!-- <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=",">--> <!-- #{locNo}--> <!-- </foreach>--> <!-- AND loc_sts not in ('O') order by row1--> <!-- </select>--> <select id="selectLocByLocStsPakInF1" resultMap="BaseResultMap"> SELECT top 1 * FROM [dbo].[asr_loc_mast] WHERE 1=1 and whs_type=#{whsType} and loc_no in <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=","> #{locNo} </foreach> and crn_no=#{crnNo} and bay1 = #{bay} and lev1 = #{lev} and gro1 = #{gro} AND loc_sts not in ('O') order by row1 </select> <!-- <select id="selectLocByLocStsPakInF2" resultMap="BaseResultMap">--> <!-- SELECT top 1 *--> <!-- FROM [dbo].[asr_loc_mast]--> <!-- WHERE 1=1--> <!-- and whs_type=#{whsType}--> <!-- and loc_no in--> <!-- <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=",">--> <!-- #{locNo}--> <!-- </foreach>--> <!-- AND loc_sts not in ('O') order by row1 desc--> <!-- </select>--> <select id="selectLocByLocStsPakInF2" resultMap="BaseResultMap"> SELECT top 1 * FROM [dbo].[asr_loc_mast] WHERE 1=1 and whs_type=#{whsType} and loc_no in <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=","> #{locNo} </foreach> and crn_no=#{crnNo} and bay1 = #{bay} and lev1 = #{lev} and gro1 = #{gro} AND loc_sts not in ('O') order by row1 desc </select> <!-- <select id="selectLocByLocStsPakInO1" resultMap="BaseResultMap">--> <!-- SELECT top 1 *--> <!-- FROM [dbo].[asr_loc_mast]--> <!-- WHERE 1=1--> <!-- and whs_type=#{whsType}--> <!-- and loc_no in--> <!-- <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=",">--> <!-- #{locNo}--> <!-- </foreach>--> <!-- AND loc_sts in ('O') order by row1 desc--> <!-- </select>--> <select id="selectLocByLocStsPakInO1" resultMap="BaseResultMap"> SELECT top 1 * FROM [dbo].[asr_loc_mast] WHERE 1=1 and whs_type=#{whsType} and loc_no in <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=","> #{locNo} </foreach> and crn_no=#{crnNo} and bay1 = #{bay} and lev1 = #{lev} and gro1 = #{gro} AND loc_sts in ('O') order by row1 desc </select> <!-- <select id="selectLocByLocStsPakInO2" resultMap="BaseResultMap">--> <!-- SELECT top 1 *--> <!-- FROM [dbo].[asr_loc_mast]--> <!-- WHERE 1=1--> <!-- and whs_type=#{whsType}--> <!-- and loc_no in--> <!-- <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=",">--> <!-- #{locNo}--> <!-- </foreach>--> <!-- AND loc_sts in ('O') order by row1--> <!-- </select>--> <select id="selectLocByLocStsPakInO2" resultMap="BaseResultMap"> SELECT top 1 * FROM [dbo].[asr_loc_mast] WHERE 1=1 and whs_type=#{whsType} and loc_no in <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=","> #{locNo} </foreach> and crn_no=#{crnNo} and bay1 = #{bay} and lev1 = #{lev} and gro1 = #{gro} AND loc_sts in ('O') order by row1 </select> src/main/resources/mapper/WrkMastMapper.xml
@@ -75,4 +75,29 @@ order by io_time,wrk_no asc </select> <select id="selectWrkMastWrkDetlMatnrBatch" resultMap="BaseResultMap"> select m.* from asr_wrk_mast m,asr_wrk_detl d where 1=1 and m.wrk_no = d.wrk_no and m.io_type = #{ioType} and m.crn_no = #{crnNo} and d.matnr = #{matnr} <choose> <when test="batch != null and batch != ''"> and d.batch = #{batch} </when> <otherwise> and (d.batch IS NULL OR d.batch = '') </otherwise> </choose> <choose> <when test="grade != null and grade != ''"> and d.brand = #{grade} </when> <otherwise> and (d.brand IS NULL OR d.brand = '') </otherwise> </choose> </select> </mapper> src/main/webapp/static/image/logo.png