自动化立体仓库 - WMS系统
Junjie
2023-05-26 f7e5ec05f10452c90bdf5130385ebf878ce338c9
单品找库位逻辑
10个文件已修改
160 ■■■■ 已修改文件
src/main/java/com/zy/asrs/mapper/LocMastMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocMastService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkMastService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocMastMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -43,7 +43,7 @@
    LocMast findInEmptyLocMast(Short locType1, @Param("rows") List<Integer> rows);
    //在库位组中搜索可入的空库位
    LocMast findEmptyLocMastByLocNos(Short locType1, @Param("locNos") List<String> locNos);
    List<LocMast> findEmptyLocMastByLocNos(Short locType1, @Param("locNos") List<String> locNos);
    //搜索低频(混放区域)空库位
    List<LocMast> findEmptyLowFrequencyLocMast(Short locType1);
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -29,4 +29,9 @@
    WrkMast selectPakoutOfStaNo(@Param("staNo")Integer staNo);
    /**
     * 获取相同规格货物的库位号,且状态为S入库预约类型
     */
    List<WrkMast> selectSameWrkMast(String matnr);
}
src/main/java/com/zy/asrs/service/LocMastService.java
@@ -62,7 +62,7 @@
    LocMast findInEmptyLocMast(Short locType1, List<Integer> rows);
    //在库位组中搜索可入的空库位
    LocMast findEmptyLocMastByLocNos(Short locType1, List<String> locNos);
    List<LocMast> findEmptyLocMastByLocNos(Short locType1, List<String> locNos);
    //搜索低频(混放区域)空库位
    List<LocMast> findEmptyLowFrequencyLocMast(Short locType1);
src/main/java/com/zy/asrs/service/WrkMastService.java
@@ -30,4 +30,9 @@
    WrkMast selectPakoutOfStaNo(Integer staNo);
    /**
     * 获取相同规格货物的库位号,且状态为S入库预约类型
     */
    List<WrkMast> selectSameWrkMast(String matnr);
}
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -215,7 +215,7 @@
    }
    @Override
    public LocMast findEmptyLocMastByLocNos(Short locType1, List<String> locNos) {
    public List<LocMast> findEmptyLocMastByLocNos(Short locType1, List<String> locNos) {
        return this.baseMapper.findEmptyLocMastByLocNos(locType1, locNos);
    }
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
@@ -116,4 +116,8 @@
        return this.baseMapper.selectPakoutOfStaNo(staNo);
    }
    @Override
    public List<WrkMast> selectSameWrkMast(String matnr) {
        return this.baseMapper.selectSameWrkMast(matnr);
    }
}
src/main/java/com/zy/asrs/utils/Utils.java
@@ -564,6 +564,49 @@
        }
    }
    /**
     * 检测当前库位内侧其他库位是否为D、F、X
     * 返回true表示内侧库位不是DFX,返回false表示内侧库位是DFX
     */
    public static boolean checkInsideLocIsDFX(String locNo) {
        LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
        List<String> insideLoc = Utils.getGroupInsideLoc(locNo);
        if (insideLoc.size() > 0) {
            List<LocMast> insideLocMast = locMastService.selectByLocNos(insideLoc);
            for (LocMast mast : insideLocMast) {
                if (!mast.getLocSts().equals("D")
                        && !mast.getLocSts().equals("F")
                        && !mast.getLocSts().equals("X")) {
                    //D、F、X(不能选定这个外侧库位)
                    return true;
                }
            }
        }
        return false;
    }
    /**
     * 检测当前库位内侧其他库位是否为D、F、X、S
     * 返回true表示内侧库位不是DFX,返回false表示内侧库位是DFX
     */
    public static boolean checkInsideLocIsDFXS(String locNo) {
        LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
        List<String> insideLoc = Utils.getGroupInsideLoc(locNo);
        if (insideLoc.size() > 0) {
            List<LocMast> insideLocMast = locMastService.selectByLocNos(insideLoc);
            for (LocMast mast : insideLocMast) {
                if (!mast.getLocSts().equals("D")
                        && !mast.getLocSts().equals("F")
                        && !mast.getLocSts().equals("X")
                        && !mast.getLocSts().equals("S")) {
                    //D、F、X、S(不能选定这个外侧库位)
                    return true;
                }
            }
        }
        return false;
    }
    public static void main(String[] args) {
        List<String> groupLoc = Utils.getGroupLoc("1300801");
        System.out.println(groupLoc);
src/main/java/com/zy/common/service/CommonService.java
@@ -241,12 +241,19 @@
    //单品类型入库
    private LocMast getLocNoStep2(LocTypeDto locTypeDto, List<String> matNos, List<Integer> rows) {
        LocMast locMast = null;
        //找内侧空库位(非最外侧库位)
        List<String> locNos = locDetlService.getSameDetl(matNos.get(0));
        for (String locNo : locNos) {
            List<String> groupLoc = Utils.getGroupLoc(locNo);
            LocMast locMast0 = locMastService.findEmptyLocMastByLocNos(locTypeDto.getLocType1(), groupLoc);
            if (null != locMast0) {
        //先找工作档
        List<WrkMast> wrkMasts = wrkMastService.selectSameWrkMast(matNos.get(0));
        for (WrkMast wrkMast : wrkMasts) {
            List<String> groupLoc = Utils.getGroupLoc(wrkMast.getLocNo());
            List<LocMast> locMasts = locMastService.findEmptyLocMastByLocNos(locTypeDto.getLocType1(), groupLoc);
            for (LocMast locMast0 : locMasts) {
                //检测当前库位内侧其他库位是否为D、F、X、S
                if (Utils.checkInsideLocIsDFXS(locMast0.getLocNo())) {
                    //内侧其他库位不是D、F、X、S。不能选取该库位
                    continue;
                }
                // 浅库位符合尺寸检测
                if (VersionUtils.locMoveCheckLocType(locMast0, locTypeDto)) {
                    // 浅库位对应堆垛机必须可用且无异常
@@ -255,6 +262,34 @@
                        if (locMastService.checkEmptyCount(locMast0, 10)) {
                            locMast = locMast0;
                            break;
                        }
                    }
                }
            }
        }
        //找内侧空库位(非最外侧库位)
        if (locMast == null) {
            List<String> locNos = locDetlService.getSameDetl(matNos.get(0));
            for (String locNo : locNos) {
                List<String> groupLoc = Utils.getGroupLoc(locNo);
                List<LocMast> locMasts = locMastService.findEmptyLocMastByLocNos(locTypeDto.getLocType1(), groupLoc);
                for (LocMast locMast0 : locMasts) {
                    //检测当前库位内侧其他库位是否为D、F、X
                    if (Utils.checkInsideLocIsDFX(locMast0.getLocNo())) {
                        //内侧其他库位不是D、F、X。不能选取该库位
                        continue;
                    }
                    // 浅库位符合尺寸检测
                    if (VersionUtils.locMoveCheckLocType(locMast0, locTypeDto)) {
                        // 浅库位对应堆垛机必须可用且无异常
                        if (true || basCrnpService.checkSiteError(locMast0.getCrnNo(), true)) {
                            // 因库位移转、需预留空库位
                            if (locMastService.checkEmptyCount(locMast0, 10)) {
                                locMast = locMast0;
                                break;
                            }
                        }
                    }
                }
@@ -276,21 +311,8 @@
        List<LocMast> locMasts = locMastService.findOutMast(locTypeDto.getLocType1(), crnNos);
        for (LocMast locMast0 : locMasts) {
            //检测当前库位内侧其他库位是否为D、F、X
            boolean flag = false;
            List<String> insideLoc = Utils.getGroupInsideLoc(locMast0.getLocNo());
            if (insideLoc.size() > 0) {
                List<LocMast> insideLocMast = locMastService.selectByLocNos(insideLoc);
                for (LocMast mast : insideLocMast) {
                    if (!mast.getLocSts().equals("D")
                            && !mast.getLocSts().equals("F")
                            && !mast.getLocSts().equals("X")) {
                        //D、F、X(不能选定这个外侧库位)
                        flag = true;
                        break;
                    }
                }
            }
            if (flag) {
            if (Utils.checkInsideLocIsDFX(locMast0.getLocNo())) {
                //内侧其他库位不是D、F、X。不能选取该库位
                continue;
            }
@@ -315,21 +337,13 @@
        List<LocMast> locMasts = locMastService.findEmptyLowFrequencyLocMast(locTypeDto.getLocType1());
        for (LocMast locMast0 : locMasts) {
            //检测当前库位内侧其他库位是否为D、F、X
            boolean flag = false;
            List<String> insideLoc = Utils.getGroupInsideLoc(locMast0.getLocNo());
            if (insideLoc.size() > 0) {
                List<LocMast> insideLocMast = locMastService.selectByLocNos(insideLoc);
                for (LocMast mast : insideLocMast) {
                    if (!mast.getLocSts().equals("D")
                            && !mast.getLocSts().equals("F")
                            && !mast.getLocSts().equals("X")) {
                        //D、F、X(不能选定这个外侧库位)
                        flag = true;
                        break;
                    }
                }
            if (Utils.checkInsideLocIsDFX(locMast0.getLocNo())) {
                //内侧其他库位不是D、F、X。不能选取该库位
                continue;
            }
            //检测当前库位外侧库位是否为O(空库位)
            boolean flag = false;
            List<String> outerLoc = Utils.getGroupOuterLoc(locMast0.getLocNo());
            if (outerLoc.size() > 0) {
                List<LocMast> outerLocMast = locMastService.selectByLocNos(outerLoc);
src/main/resources/mapper/LocMastMapper.xml
@@ -308,7 +308,7 @@
    </select>
    <select id="findEmptyLocMastByLocNos" resultMap="BaseResultMap">
        select top 1 * from asr_loc_mast
        select * from asr_loc_mast
        where loc_type2 = 1
        and loc_type1 = #{locType1}
        and loc_no in
src/main/resources/mapper/WrkMastMapper.xml
@@ -118,4 +118,17 @@
    </select>
    <select id="selectSameWrkMast" resultMap="BaseResultMap">
        select wm.* from asr_wrk_mast wm
        left join asr_loc_mast lm
        on lm.loc_no = wm.loc_no
        left join asr_wrk_detl wd
        on wd.wrk_no = wm.wrk_no
        where io_type=1
        and wrk_sts &lt; 11
        and lm.loc_sts = 'S'
        and wd.matnr = #{matnr}
        ORDER BY wm.wrk_no desc
    </select>
</mapper>