自动化立体仓库 - WMS系统
zwl
2 天以前 9145f8a44c6ae733019e43c775cc30243032e502
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -76,6 +76,8 @@
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private OrderDetlPakoutService orderDetlPakoutService;
    @Autowired
    private ConfigService configService;
    @Autowired
    private WcsController wcsController;
@@ -880,7 +882,7 @@
    public String emptyPlateIn(Integer devpNo, Long userId) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        // 检索库位;人工空托盘入库固定传 staDescId=10,实际找位规则集中在 CommonService。
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
@@ -1534,6 +1536,7 @@
                    throw new CoolException("保存数据失败");
                }
            }
            rollbackPakoutOrderWorkQty(wrkMast, wrkDetls, userId, now);
            for (WrkDetl wrkDetl : wrkDetls) {
//                if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
////                    if (!orderDetlService.decrease(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme())) {
@@ -1621,6 +1624,63 @@
        }
    }
    /**
     * 出库任务取消时回滚出库订单明细的任务生成数量。
     *
     * 延迟出库订单中:
     * - work_qty 表示已经生成任务的数量;
     * - qty 表示已经完成出库的数量。
     *
     * WCS 取消或本地取消任务后,任务会被移入历史档并删除当前工作档。
     * 如果不回滚 work_qty,后续同一订单再次下发时系统会误认为这些明细仍已生成任务。
     */
    private void rollbackPakoutOrderWorkQty(WrkMast wrkMast, List<WrkDetl> wrkDetls, Long userId, Date now) {
        if (wrkMast == null || Cools.isEmpty(wrkDetls)) {
            return;
        }
        for (WrkDetl wrkDetl : wrkDetls) {
            if (wrkDetl == null || Cools.isEmpty(wrkDetl.getOrderNo())) {
                continue;
            }
            OrderDetlPakout orderDetl = findPakoutOrderDetlForRollback(wrkMast, wrkDetl);
            if (orderDetl == null) {
                continue;
            }
            double oldWorkQty = safeDouble(orderDetl.getWorkQty());
            double rollbackQty = safeDouble(wrkDetl.getAnfme());
            double completedQty = safeDouble(orderDetl.getQty());
            double newWorkQty = Math.max(completedQty, oldWorkQty - rollbackQty);
            orderDetl.setWorkQty(newWorkQty);
            orderDetl.setUpdateBy(userId);
            orderDetl.setUpdateTime(now);
            if (!orderDetlPakoutService.updateById(orderDetl)) {
                throw new CoolException("出库任务取消回滚订单明细作业数量失败:" + wrkDetl.getOrderNo());
            }
        }
    }
    private OrderDetlPakout findPakoutOrderDetlForRollback(WrkMast wrkMast, WrkDetl wrkDetl) {
        String palletId = null;
        if (wrkDetl != null && !Cools.isEmpty(wrkDetl.getZpallet())) {
            palletId = wrkDetl.getZpallet();
        } else if (wrkMast != null) {
            palletId = wrkMast.getBarcode();
        }
        if (!Cools.isEmpty(palletId)) {
            OrderDetlPakout orderDetl = orderDetlPakoutService.selectItemByOrderNoAndPallet(wrkDetl.getOrderNo(), palletId);
            if (orderDetl != null) {
                return orderDetl;
            }
        }
        return orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(),
                wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
    }
    private double safeDouble(Double value) {
        return value == null ? 0.0D : value;
    }
    @Override
    @Transactional
    public void pickWrkMast(String workNo, Long userId) {