自动化立体仓库 - WMS系统
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;
@@ -367,6 +369,7 @@
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("N"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setPdcType("N");
            wrkMast.setBarcode(locMast.getBarcode());
            wrkMast.setTakeNone("0");  //0非自动
@@ -749,6 +752,7 @@
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("N");
        wrkMast.setPdcType("N");
        wrkMast.setBarcode(locMast.getBarcode());
        wrkMast.setAppeUser(userId); // 操作人员数据
        wrkMast.setAppeTime(now);
@@ -878,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();
@@ -984,6 +988,7 @@
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("Y"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setPdcType("N");
            wrkMast.setAppeUser(userId);
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(userId);
@@ -1046,6 +1051,7 @@
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("Y"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setPdcType("N");
            wrkMast.setAppeUser(1L);
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(1L);
@@ -1530,38 +1536,39 @@
                    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())) {
//                        throw new CoolException("订单数据回滚失败");
//                    }
                    OrderInAndOutUtil.decrease(Boolean.FALSE,wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(),wrkDetl.getBrand(),
                            wrkDetl.getStandby1(),wrkDetl.getStandby2(),wrkDetl.getStandby3(),
                            wrkDetl.getBoxType1(),wrkDetl.getBoxType2(),wrkDetl.getBoxType3(), wrkDetl.getAnfme());
                    //修改订单主表状态,没有作业数量时才可以修改
                    boolean flag = true;
//                    List<OrderDetl> orderDetls = orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_no",wrkDetl.getOrderNo()));
                    Order order = OrderInAndOutUtil.selectByNo(Boolean.FALSE, wrkDetl.getOrderNo());
                    List<OrderDetl> orderDetls = OrderInAndOutUtil.selectByOrderId(Boolean.FALSE, order.getId());
                    for(OrderDetl orderDetl : orderDetls){
                        if(orderDetl.getWorkQty() > 0){
                            flag = false;
                        }
                    }
                    if(flag){
//                        Order order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no",wrkDetl.getOrderNo()));
                        if(!Cools.isEmpty(order) && order.getSettle()==2){
                            order.setSettle(1L);
                            order.setUpdateBy(userId);
                            order.setUpdateTime(now);
                        }
//                        if(!orderService.update(order,new EntityWrapper<Order>().eq("order_no",wrkDetl.getOrderNo()))){
//                            throw new CoolException("修改订单状态失败");
//                if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
////                    if (!orderDetlService.decrease(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme())) {
////                        throw new CoolException("订单数据回滚失败");
////                    }
//                    OrderInAndOutUtil.decrease(Boolean.FALSE,wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(),wrkDetl.getBrand(),
//                            wrkDetl.getStandby1(),wrkDetl.getStandby2(),wrkDetl.getStandby3(),
//                            wrkDetl.getBoxType1(),wrkDetl.getBoxType2(),wrkDetl.getBoxType3(), wrkDetl.getAnfme());
//
//                    //修改订单主表状态,没有作业数量时才可以修改
//                    boolean flag = true;
////                    List<OrderDetl> orderDetls = orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_no",wrkDetl.getOrderNo()));
//                    Order order = OrderInAndOutUtil.selectByNo(Boolean.FALSE, wrkDetl.getOrderNo());
//                    List<OrderDetl> orderDetls = OrderInAndOutUtil.selectByOrderId(Boolean.FALSE, order.getId());
//                    for(OrderDetl orderDetl : orderDetls){
//                        if(orderDetl.getWorkQty() > 0){
//                            flag = false;
//                        }
                        OrderInAndOutUtil.updateOrder(Boolean.FALSE,order.getId(),order.getSettle(),userId);
                    }
                }
//                    }
//                    if(flag){
////                        Order order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no",wrkDetl.getOrderNo()));
//                        if(!Cools.isEmpty(order) && order.getSettle()==2){
//                            order.setSettle(1L);
//                            order.setUpdateBy(userId);
//                            order.setUpdateTime(now);
//                        }
////                        if(!orderService.update(order,new EntityWrapper<Order>().eq("order_no",wrkDetl.getOrderNo()))){
////                            throw new CoolException("修改订单状态失败");
////                        }
//                        OrderInAndOutUtil.updateOrder(Boolean.FALSE,order.getId(),order.getSettle(),userId);
//                    }
//                }
            }
        }
@@ -1617,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) {