自动化立体仓库 - WMS系统
skyouc
15 小时以前 c28812eb7e5afa79cb5e2f4fbee7f96c7d7767ed
AGV出库,立库查询库存优化
6个文件已修改
148 ■■■■ 已修改文件
src/main/java/com/zy/asrs/mapper/LocMastMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocMastService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocMastMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -62,4 +62,6 @@
     * @return 库位号
     */
    String findFirstFrozenLocNo(@Param("locNoList") List<String> locNoList);
    LocMast selectNotFull(@Param("locType")Long locType, @Param("id")Long id);
}
src/main/java/com/zy/asrs/service/LocMastService.java
@@ -62,4 +62,14 @@
    //查询指定楼层的库位数据
    List<LocMast> selectLocByLev(Integer lev);
    /**
     * 获取未满板托盘
     * @author Ryan
     * @date 2026/4/3 13:01
     * @param locType
     * @param id
     * @return com.zy.asrs.entity.LocMast
     */
    LocMast selectNotFull(Long locType, Long id);
}
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -119,6 +119,11 @@
    }
    @Override
    public LocMast selectNotFull(Long locType, Long id) {
        return this.baseMapper.selectNotFull(locType, id);
    }
    @Override
    public Boolean checkWhole(List<LocDetl> locDetls) {
        return null;
    }
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -1740,7 +1740,7 @@
                double val = Math.round((combMat.getAnfme() + wrkDetl.getAnfme()) * 10000) / 10000.0;
                WrkDetl detl = new WrkDetl();
                detl.setOrderNo(stationDetl.getOrderNo());
                detl.setBoxType1(wrkDetl.getBoxType1());
                detl.setBoxType1(param.getBoxType1());
                detl.setZpallet(param.getBarcode());
                detl.setBarcode(param.getBarcode());
                detl.setThreeCode(combMat.getThreeCode());
@@ -2250,7 +2250,16 @@
        AtomicReference<Double> totalOut = new AtomicReference<>(0.0);
        listMap.forEach((matnr, detls) -> {
            Map<String, List<LocDetl>> supIds = detls.stream().collect(Collectors.groupingBy(LocDetl::getStandby1));
            supIds.forEach((supId, sups) -> {
            for (String supId : supIds.keySet()) {
                List<LocDetl> sups = supIds.get(supId);
//            }
//            supIds.forEach((supId, sups) -> {
                Mat mats = matService.selectOne(new EntityWrapper<Mat>()
                        .eq("supp_code", supId)
                        .eq("matnr", matnr));
                if (Objects.isNull(mats)) {
                    throw new CoolException("物料不存在!!");
                }
                // 根据supId(供应商)分类,得到需要存放的总空库存数量
                Double sum = sups.stream().mapToDouble(LocDetl::getAnfme).sum();
                AtomicReference<Double> itemed = new AtomicReference<>(0.0);
@@ -2278,12 +2287,6 @@
                        if (container.getMixMax() > sets.size()) {
                            //余下可混放种类
                            long suplus = Math.round((container.getMixMax() - sets.size()) * 10000) / 10000;
                            Mat mats = matService.selectOne(new EntityWrapper<Mat>()
                                    .eq("supp_code", supId)
                                    .eq("matnr", matnr));
                            if (Objects.isNull(mats)) {
                                throw new CoolException("物料不存在!!");
                            }
                            //余下最大可放数量
                            Double v = Math.round((mats.getUpQty() * suplus) * 10000) / 10000.0;
                            // 入库数量小于零且入库数量减去已计划出数量大于零()
@@ -2296,8 +2299,46 @@
                            }
                        }
                    });
                } else {
                    // 获取当前供应商+ 物料在库
                    LocMast notFullList = locMastService.selectNotFull(mats.getLocType(), one.getId());
                    if (Objects.isNull(notFullList)) {
                        continue;
                    }
                    BasContainer container = basContainerService
                            .selectOne(new EntityWrapper<BasContainer>().eq("barcode", notFullList.getBarcode()));
                    if (Objects.isNull(container)) {
                        throw new CoolException("数据错误,容器不存在!!");
                    }
                    List<LocDetl> adetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", notFullList.getLocNo()));
                    Set<String> sets = adetls.stream().map(LocDetl::getMatnr).collect(Collectors.toSet());
                    List<LocDetl> locDtls = new ArrayList<>();
                    // 判断容器是否还可混放,及当前物料可放多少
                    if (container.getMixMax() > sets.size()) {
                        //余下可混放种类
                        long suplus = Math.round((container.getMixMax() - sets.size()) * 10000) / 10000;
                        //余下最大可放数量
                        Double v = Math.round((mats.getUpQty() * suplus) * 10000) / 10000.0;
                        // 入库数量小于零且入库数量减去已计划出数量大于零()
                        if (sum.compareTo(v) <= 0 && sum.compareTo(itemed.get()) > 0) {
                            itemed.set(Math.round((itemed.get() + v) * 10000) / 10000.0);
                            // 可放下
                            LocDetl locDetl = new LocDetl();
                            BeanUtils.copyProperties(mats, locDetl);
                            locDetl.setLocNo(notFullList.getLocNo());
                            locDetl.setAnfme(0.0);
                            locDetl.setMatnr(mats.getMatnr());
                            locDetl.setZpallet(notFullList.getBarcode());
                            locDetl.setSuppCode(mats.getSuppCode());
                            locDetl.setMaktx(mats.getMaktx());
                            locDtls.add(locDetl);
                            CrnTaskDetlDTO crnTaskDetlDTO = new CrnTaskDetlDTO().setLocNo(notFullList.getLocNo()).setLocDetlList(locDtls);
                            locMasts.add(crnTaskDetlDTO);
                            totalOut.set(Math.round((totalOut.get() + itemed.get()) * 10000) / 10000.0);
                        }
                    }
                }
            });
            }
        });
        /**是否优先空板出库*/
@@ -2314,7 +2355,6 @@
            }
            CrnTaskDetlDTO crnTaskDetlDTO = new CrnTaskDetlDTO().setLocNo(locMast.getLocNo()).setLocDetlList(new ArrayList<>());
            locMasts.add(crnTaskDetlDTO);
            // 空板出库
            generateTask(locMasts, TaskIOType.MERGE_OUT.type, basDevp, userId, station);
        } else {
@@ -2626,14 +2666,14 @@
            if (Objects.isNull(station)) {
                throw new CoolException("站点不存在!!");
            }
            station.setLocSts("O"); // S.入库预约
            station.setLocSts("O");
            station.setBarcode(barcode);
            station.setModiTime(new Date());
            station.setModiUser(userId);
            if (!basStationService.updateById(station)) {
                throw new CoolException("更新目标库位状态失败");
            }
            basStationDetlService.delete(new EntityWrapper<BasStationDetl>().eq("dev_no", station.getDevNo()));
        }
    }
@@ -2718,13 +2758,12 @@
        if (Objects.isNull(station)) {
            throw new CoolException("站点不存在!!");
        }
        try {
            //空台车回库
            generateAgvTask("agv_back", locCache, callAgvBackParam.getOrgSite(), station.getBarcode(), userId, "M2");
        } catch (Exception e) {
            e.printStackTrace();
            return R.error(e.getMessage());
            log.error(e.getMessage());
            throw new CoolException(e.getMessage());
        }
        return R.ok(locCache);
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -370,35 +370,35 @@
                                    .eq("supp_code", wrkDetl.getSuppCode())
                                    .eq("matnr", wrkDetl.getMatnr())
                                    .eq("loc_no", locMast.getLocNo()));
                            // 更新订单完成数量
                            OrderDetlPakin detlPakin = orderDetlPakinService.selectOne(new EntityWrapper<OrderDetlPakin>()
//                                                .eq("three_code", wrkDetl.getThreeCode()) //TODO 并板时需要修改BSCODE为订单bscode
                                    .eq("supp_code", wrkDetl.getSuppCode())
                                    .eq("matnr", wrkDetl.getMatnr())
                                    .eq("order_no", wrkDetl.getOrderNo()));
                            if (!Cools.isEmpty(detlPakin)) {
                                //任务明细数量=新入库数量 + 原库存数量
                                double locQty = 0.0;
                                if (!Objects.isNull(locDetl)) {
                                    locQty = locDetl.getAnfme();
                                }
                                double v = Math.round((wrkDetl.getAnfme() - locQty) * 10000) / 10000.0;
                                double v1 = Math.round((detlPakin.getQty() + v) * 10000) / 10000.0;
                                detlPakin.setQty(v1);
                                detlPakin.setWorkQty(v1);
                                detlPakin.setAdjustQty(wrkDetl.getAdjustQty());
                                detlPakin.setSplusQty(wrkDetl.getSplusQty());
                                if (!orderDetlPakinService.update(detlPakin, new EntityWrapper<OrderDetlPakin>()
                                        .eq("matnr", detlPakin.getMatnr())
                                        .eq("supp_code", detlPakin.getSuppCode())
                                        .eq("order_no", detlPakin.getOrderNo()))) {
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return FAIL.setMsg("并板入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo()
                                            + "],[locNo=" + wrkMast.getLocNo() + "]");
                                }
                            }
                            if (null != locDetl) {
                                // 更新订单完成数量
                                OrderDetlPakin detlPakin = orderDetlPakinService.selectOne(new EntityWrapper<OrderDetlPakin>()
//                                                .eq("three_code", wrkDetl.getThreeCode()) //TODO 并板时需要修改BSCODE为订单bscode
                                        .eq("supp_code", wrkDetl.getSuppCode())
                                        .eq("matnr", wrkDetl.getMatnr())
                                        .eq("order_no", wrkDetl.getOrderNo()));
                                try {
                                    if (!Cools.isEmpty(detlPakin)) {
                                        double v = Math.round((wrkDetl.getAnfme() - locDetl.getAnfme()) * 10000) / 10000.0;
                                        double v1 = Math.round((detlPakin.getQty() + v) * 10000) / 10000.0;
                                        detlPakin.setQty(v1);
                                        detlPakin.setWorkQty(v1);
                                        detlPakin.setAdjustQty(wrkDetl.getAdjustQty());
                                        detlPakin.setSplusQty(wrkDetl.getSplusQty());
                                        if (!orderDetlPakinService.update(detlPakin, new EntityWrapper<OrderDetlPakin>()
                                                .eq("matnr", detlPakin.getMatnr())
                                                .eq("supp_code", detlPakin.getSuppCode())
                                                .eq("order_no", detlPakin.getOrderNo()))) {
                                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                            return FAIL.setMsg("并板入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo()
                                                    + "],[locNo=" + wrkMast.getLocNo() + "]");
                                        }
                                    }
                                } catch (Exception e) {
                                    log.error(e.getMessage());
                                }
                                LocDetl detl = new LocDetl();
                                detl.setAnfme(wrkDetl.getAnfme());
                                detl.setStandby1(wrkDetl.getSuppCode());
src/main/resources/mapper/LocMastMapper.xml
@@ -215,5 +215,13 @@
            #{item}
        </foreach>
    </select>
    <select id="selectNotFull" resultType="com.zy.asrs.entity.LocMast">
        SELECT
            TOP 1 *
        FROM
            asr_loc_mast
        WHERE
            barcode IN (SELECT zpallet  FROM asr_loc_detl ald INNER JOIN man_mat mt ON ald.matnr = mt.matnr AND ald.supp_code = mt.supp_code  WHERE mt.loc_type =#{locType}  AND area_id = #{id} GROUP BY zpallet HAVING COUNT ( * ) &lt; 2) ORDER BY loc_no, modi_time ASC
    </select>
</mapper>