自动化立体仓库 - WMS系统
Junjie
2023-05-29 80c54edf900521057f69c81abb5cf3c056926350
出库作业-提取后自动选择出库库位
6个文件已修改
219 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/param/StockOutParam.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocDetlService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/StockOutParam.java
@@ -31,6 +31,13 @@
        // 数量
        private Double count;
        public LocDetl(String locNo, String matnr, String batch, Double count) {
            this.locNo = locNo;
            this.matnr = matnr;
            this.batch = batch;
            this.count = count;
        }
    }
}
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -73,5 +73,10 @@
    List<LocDetl> selectByLocNo(@Param("locNo") String locNo);
    List<LocDetl> selectByLocNosAndMatnr(@Param("locNos") List<String> locNos, String matnr);
    List<LocDetl> searchByLike(String orderNo, String matnr, String maktx, String specs, String locNo);//通过订单号、物料号、物料名称、规格、库位号进行模糊搜索
    List<LocDetl> findAreaByMatnr(String matnr,Integer locType2);
}
src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -68,5 +68,13 @@
    List<LocDetl> selectByLocNo(String locNo);
    List<LocDetl> selectByLocNosAndMatnr(List<String> locNos, String matnr);
    List<LocDetl> searchByLike(String orderNo, String matnr, String maktx, String specs, String locNo);//通过订单号、物料号、物料名称、规格、库位号进行模糊搜索
    List<LocDetl> findHighAreaByMatnr(String matnr);//通过物料号查询高频区域
    List<LocDetl> findSingleAreaByMatnr(String matnr);//通过物料号查询单品区域
    List<LocDetl> findLowAreaByMatnr(String matnr);//通过物料号查询低频混放区
}
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -154,6 +154,10 @@
        return this.baseMapper.selectByLocNo(locNo);
    }
    @Override
    public List<LocDetl> selectByLocNosAndMatnr(List<String> locNos, String matnr) {
        return this.baseMapper.selectByLocNosAndMatnr(locNos, matnr);
    }
    @Override
    public LocDetl selectItem(String locNo, String matnr, String batch) {
@@ -167,4 +171,19 @@
        }
        return this.baseMapper.searchByLike(orderNo, matnr, maktx, specs, locNo);
    }
    @Override
    public List<LocDetl> findHighAreaByMatnr(String matnr) {
        return this.baseMapper.findAreaByMatnr(matnr, 2);
    }
    @Override
    public List<LocDetl> findSingleAreaByMatnr(String matnr) {
        return this.baseMapper.findAreaByMatnr(matnr, 1);
    }
    @Override
    public List<LocDetl> findLowAreaByMatnr(String matnr) {
        return this.baseMapper.findAreaByMatnr(matnr, 3);
    }
}
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -160,8 +160,38 @@
    @Transactional
    public void startupFullTakeStore(StockOutParam param, Long userId) {
        ArrayList<String> locNos = new ArrayList<>();
        for (StockOutParam.LocDetl locDetl:param.getLocDetls()){
            if (!locNos.contains(locDetl.getLocNo())){
        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());
            }
        }
@@ -173,7 +203,7 @@
        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()));
@@ -192,6 +222,132 @@
        }
    }
    //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(), locDetl0.getAnfme()));
                    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;
                    }
                    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;
                }
            }
        }
        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
    @Transactional
    public void stockOut(BasDevp staNo, List<LocDetlDto> locDetlDtos, IoWorkType ioWorkType, Long userId) {
src/main/resources/mapper/LocDetlMapper.xml
@@ -512,9 +512,17 @@
        SELECT  *  FROM [dbo].[asr_loc_detl_group] WHERE 1 = 1
        <include refid="groupListCondition"></include>
    </select>
    <select id="selectByLocNo" resultMap="BaseResultMap">
        SELECT * FROM asr_loc_detl WHERE loc_no = #{locNo}
    </select>
    <select id="selectByLocNosAndMatnr" resultMap="BaseResultMap">
        SELECT * FROM asr_loc_detl WHERE loc_no in
        <foreach item="item" collection="locNos" index="index"  separator="," open="(" close=")">
            #{item}
        </foreach>
        and matnr = #{matnr}
    </select>
    <select id="searchByLike" resultMap="BaseResultMap">
@@ -539,4 +547,14 @@
        </if>
    </select>
    <select id="findAreaByMatnr" resultMap="BaseResultMap">
        select * from asr_loc_detl ld
        left join asr_loc_mast lm
        on lm.loc_no = ld.loc_no
        where matnr = #{matnr}
        and loc_type2 = #{locType2}
        and loc_sts = 'F'
        order by anfme desc,row1,bay1,lev1
    </select>
</mapper>