自动化立体仓库 - WMS系统
#
LSH
2024-03-04 497d1f54675810ff6fbc52018213dfd7e12cd16d
#
6个文件已修改
240 ■■■■ 已修改文件
src/main/java/com/zy/asrs/mapper/LocMastMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocMastService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocMastMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -25,4 +25,24 @@
    List<LocMast> selectLocShuttleMoveUnilateralY(@Param("bay")Integer bay,@Param("lev")Integer lev);
    List<LocMast> selectLocShuttleMoveUnilateralN(@Param("bay")Integer bay,@Param("lev")Integer lev);
    /*
     * 获取目标库位所在巷道最浅非空库位  深>浅
     * */
    LocMast selectLocByLocStsPakInF1(@Param("locNos") List<String> locNos);
    /*
     * 获取目标库位所在巷道最浅非空库位  深<浅
     * */
    LocMast selectLocByLocStsPakInF2(@Param("locNos") List<String> locNos);
    /*
     * 获取目标库位所在巷道最深空库位  深>浅
     * */
    LocMast selectLocByLocStsPakInO1(@Param("locNos") List<String> locNos);
    /*
     * 获取目标库位所在巷道最深空库位  深<浅
     * */
    LocMast selectLocByLocStsPakInO2(@Param("locNos") List<String> locNos);
}
src/main/java/com/zy/asrs/service/LocMastService.java
@@ -40,4 +40,14 @@
    List<LocMast> queryShallowLocFMast(Integer crnNo);
    List<LocMast> selectLocMastShuttleMoveUnilateral(Integer bay,Integer lev,Integer crnNo);
    /*
     * 获取目标库位所在巷道最浅非空库位
     * */
    LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos);
    /*
     * 获取目标库位所在巷道最深空库位
     * */
    LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos);
}
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -43,6 +43,28 @@
        return this.baseMapper.selectEmptyLocCount(locMast.getLocType1(), locMast.getCrnNo()) > 1;
    }
    /*
     *获取目标库位所在巷道最浅非空库位
     * */
    @Override
    public LocMast selectLocByLocStsPakInF(Integer curRow,Integer nearRow,List<String> locNos) {
        if (curRow<nearRow){
            return this.baseMapper.selectLocByLocStsPakInF1(locNos);
        }
        return this.baseMapper.selectLocByLocStsPakInF2(locNos);
    }
    /*
     * 获取目标库位所在巷道最深空库位
     * */
    @Override
    public LocMast selectLocByLocStsPakInO(Integer curRow,Integer nearRow,List<String> locNos) {
        if (curRow<nearRow){
            return this.baseMapper.selectLocByLocStsPakInO1(locNos);
        }
        return this.baseMapper.selectLocByLocStsPakInO2(locNos);
    }
    @Override
    public Boolean checkWhole(List<LocDetl> locDetls) {
        return null;
src/main/java/com/zy/asrs/utils/Utils.java
@@ -218,15 +218,22 @@
//        System.out.println(deepRow);
//    }
    public static boolean BooleanWhsTypeStaIoType(Integer whsType) {  //查询相似物料开关
        if (whsType == 1 || whsType==3 || whsType==4) {
            return true;
        }
        return false;
    }
    public static boolean BooleanWhsTypeSta(Integer whsType) {
        if (whsType == 1) {
        if (whsType == 1 || whsType == 2 || whsType == 5 || whsType==3 || whsType==4) {
            return true;
        }
        return false;
    }
    public static boolean BooleanWhsTypeSta(Integer whsType, Integer staDescId) {
        if (whsType == 1 && staDescId != 11 && staDescId != 111) {
        if ((whsType == 1 || whsType == 5 || whsType == 2 || whsType==3 || whsType==4) && staDescId != 11 && staDescId != 111) {
            return true;
        }
        return false;
@@ -360,4 +367,48 @@
        return null;
    }
    public static Integer GetWhsType(Integer sourceStaNo) {
        switch (sourceStaNo){
            case 104:
            case 173:
            case 174:
            case 175:
            case 130:
            case 125:
                return 5;
            case 204:
            case 273:
            case 274:
            case 275:
            case 230:
            case 225:
                return 2;
            default:
                return 0;
        }
    }
    /*
     * 最深库位排号 : curRow
     * 最浅库位排号 : nearRow
     * 最浅库位号,用于锁定列、层 : nearRow
     * 入库  true:pakin
     * 出库  false:pakin
     * */
    // 外侧方向的货位  优先入库方向 ===>> 反之
    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++){
                result.add(zerofill(String.valueOf(row), 2) + locNo.substring(2));
            }
        }else {
            for (int row = curRow;row>=curRow;row--){
                result.add(zerofill(String.valueOf(row), 2) + locNo.substring(2));
            }
        }
        return result;
    }
}
src/main/java/com/zy/common/service/CommonService.java
@@ -99,6 +99,7 @@
     */
    @Transactional
    public StartupDto getLocNo(Integer whsType, Integer staDescId, Integer sourceStaNo, String matnr, String batch, String grade, LocTypeDto locTypeDto) {
        whsType = Utils.GetWhsType(sourceStaNo);
        return getLocNoRun(whsType,staDescId,sourceStaNo,matnr,batch,grade,0,locTypeDto,0);
    }
@@ -152,13 +153,19 @@
        }
        //此程序用于优化堆垛机异常时的运行时间
        for (int i = times; i < crnNumber; i++) {
        for (int i = times; i < crnNumber*2; i++) {
            int[] locNecessaryParameters = Utils.LocNecessaryParameters(whsType, 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("row1", nearRow).eq("loc_sts", "O"));
                int crnCountO = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("crn_no", crnNo).le("io_type",100));
                if (locMasts.size()-crnCountO<=2){
                    times++;
                    continue;
                }
                break;
            } else {
                times++;
@@ -172,37 +179,41 @@
        boolean signRule2 = false;
        // 靠近摆放规则 --- 同天同规格物料 //分离版
//        if (!Cools.isEmpty(matnr) &&  (staDescId == 1)){
//            signRule1 = true;
//        }
        // 靠近摆放规则 --- 同天同规格物料 //互通版
        if (!Cools.isEmpty(matnr) && staDescId == 1) {
            signRule2 = true;
        }
        if (Utils.BooleanWhsTypeStaIoType(whsType)){
            // 靠近摆放规则 --- 同天同规格物料 //分离版
            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 (!Cools.isEmpty(matnr) &&  (staDescId == 11 || staDescId == 111)) {
                signRule1 = true;
            }
        }
        if (signRule1){
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow).eq("loc_sts", "O"));
            for (LocMast locMast1:locMasts){
                if (VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) {
                    continue;
                }
                String shallowLoc = Utils.getDeepLoc(slaveProperties,locMast1.getLocNo());
                LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",shallowLoc));
                if (!Cools.isEmpty(locMast2) && locMast2.getLocSts().equals("F")){
                    LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locMast2.getLocNo()));
                    if (!Cools.isEmpty(locDetl) && matnr.equals(locDetl.getMatnr())) {
                        locMast = locMast1;
                        break;
            if (nearRow!=curRow){
                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,groupOutsideLocCrn);
                    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);
                            break;
                        }
                    }
                }
            }
        }else if (signRule2){
            List<String> locNos = locDetlService.getSameDetlToday(matnr,batch, sRow, eRow);
            List<String> locNos = locDetlService.getSameDetlToday(matnr, sRow, eRow);
            for (String locNo : locNos) {
                if (Utils.isShallowLoc(slaveProperties, locNo)) {
                    continue;
@@ -223,7 +234,7 @@
        }
//        // 靠近摆放规则 --- 空托  //分离版
//        if (staDescId == 10) {
//        if (staDescId == 10 && Utils.BooleanWhsTypeStaIoType(whsType)) {
//            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow).eq("loc_sts", "O"));
//            for (LocMast locMast1:locMasts){
//                if (VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) {
@@ -239,7 +250,7 @@
//        }
        // 靠近摆放规则 --- 空托 //互通版
        if (staDescId == 10) {
        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) {
@@ -277,17 +288,18 @@
                log.error("type_no={},stn_no={},crn_no={}", staDescId, sourceStaNo, crnNo);
//                throw new CoolException("入库路径不存在");
                crnNo = 0;
            }
            staNo = basDevpService.selectById(staDesc.getCrnStn());
            if (!staNo.getAutoing().equals("Y")) {
            }else {
                staNo = basDevpService.selectById(staDesc.getCrnStn());
                if (!staNo.getAutoing().equals("Y")) {
//                throw new CoolException("目标站"+staDesc.getCrnStn()+"不可用");
                crnNo = 0;
                    crnNo = 0;
                }
                startupDto.setStaNo(staNo.getDevNo());
            }
            startupDto.setStaNo(staNo.getDevNo());
        }
        // 更新库位排号
        if (Utils.BooleanWhsTypeSta(whsType, staDescId)) {
        if (Utils.BooleanWhsTypeSta(whsType, staDescId) && Cools.isEmpty(locMast)) {
            rowLastno.setCurrentRow(curRow);
            rowLastnoService.updateById(rowLastno);
        }
@@ -296,16 +308,23 @@
        // 1.按规则查找库位
        if (Cools.isEmpty(locMast) && crnNo != 0) {
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow).eq("loc_sts", "O"));
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("row1", nearRow).eq("loc_sts", "O").orderBy("lev1",true).orderBy("bay1",true));
            for (LocMast locMast1 : locMasts) {
                if (VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) {
                if (!VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) {
                    continue;
                }
                String shallowLoc = Utils.getDeepLoc(slaveProperties, locMast1.getLocNo());
                LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", shallowLoc).eq("loc_sts", "O"));
                if (!Cools.isEmpty(locMast2)) {
                    locMast = locMast2;
                    break;
                if (Utils.BooleanWhsTypeStaIoType(whsType)){
                    String shallowLoc = Utils.getDeepLoc(slaveProperties, locMast1.getLocNo());
                    LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", shallowLoc).eq("loc_sts", "O"));
                    if (!Cools.isEmpty(locMast2)) {
                        locMast = locMast2;
                        break;
                    }
                }else {
                    if (!Cools.isEmpty(locMast1)) {
                        locMast = locMast1;
                        break;
                    }
                }
            }
        }
@@ -317,9 +336,9 @@
        // 递归查询
        if (Cools.isEmpty(locMast) || !locMast.getLocSts().equals("O")) {
            // 当前巷道无空库位时,递归调整至下一巷道,检索全部巷道无果后,跳出递归
            if (times < rowCount) {
            if (times < rowCount*2) {
                times = times + 1;
                return getLocNoRun(1, staDescId, sourceStaNo, matnr, batch, grade,moveCrnNo, locTypeDto, times);
                return getLocNoRun(whsType, staDescId, sourceStaNo, matnr, batch, grade,moveCrnNo, locTypeDto, times);
            }
//            // 2.库位当前所属尺寸无空库位时,调整尺寸参数,向上兼容检索库位
//            if (locTypeDto.getLocType1() < 2) {
src/main/resources/mapper/LocMastMapper.xml
@@ -84,4 +84,36 @@
        select * from [dbo].[asr_loc_mast] where row1>17 and row1 &lt; 31 and bay1 = #{bay} and lev1 = #{lev} and loc_sts='F' order by row1 desc
    </select>
    <select id="selectLocByLocStsPakInF1" resultMap="BaseResultMap">
        SELECT top 1 * FROM [dbo].[asr_loc_mast] WHERE 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="selectLocByLocStsPakInF2" resultMap="BaseResultMap">
        SELECT top 1 * FROM [dbo].[asr_loc_mast] WHERE 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="selectLocByLocStsPakInO1" resultMap="BaseResultMap">
        SELECT top 1 * FROM [dbo].[asr_loc_mast] WHERE 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="selectLocByLocStsPakInO2" resultMap="BaseResultMap">
        SELECT top 1 * FROM [dbo].[asr_loc_mast] WHERE loc_no in
        <foreach collection="locNos" item="locNo" index="index" open="(" close=")" separator=",">
            #{locNo}
        </foreach>
        AND loc_sts in ('O') order by row1
    </select>
</mapper>