gaoluyang
昨天 8c65f898ed6e5b0c7a94c792c4562f6ec831dccd
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java
@@ -26,10 +26,13 @@
import java.util.List;
import java.util.Set;
import java.math.BigDecimal;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_VENDOR_ITEM_NOT_IN_PURCHASE_ORDER;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_VENDOR_LINE_NOT_EXISTS;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_VENDOR_QUANTITY_EXCEED;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_VENDOR_PURCHASE_ITEM_AMBIGUOUS;
/**
 * MES 供应商退货单行 Service 实现类
@@ -60,6 +63,7 @@
        MesWmReturnVendorDO returnVendor = validateReturnVendorLineSaveData(createReqVO);
        // 退货单若已关联采购订单,物料必须属于该采购订单,禁止跨订单随意选料
        validateReturnVendorItemInPurchaseOrder(returnVendor, createReqVO.getItemId(), null);
        validateReturnQuantity(returnVendor, null, createReqVO.getItemId(), createReqVO.getQuantity());
        // 插入
        MesWmReturnVendorLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnVendorLineDO.class);
@@ -77,6 +81,7 @@
        MesWmReturnVendorDO returnVendor = validateReturnVendorLineSaveData(updateReqVO);
        // 关联采购订单时,不允许把行物料改成订单外的物料;仅改数量等操作不受影响
        validateReturnVendorItemInPurchaseOrder(returnVendor, updateReqVO.getItemId(), oldLine.getItemId());
        validateReturnQuantity(returnVendor, oldLine.getId(), updateReqVO.getItemId(), updateReqVO.getQuantity());
        // 更新
        MesWmReturnVendorLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorLineDO.class);
@@ -172,6 +177,39 @@
                        returnVendor.getCode(), resolvePurchaseOrderNo(purchaseOrderId), resolveItemDesc(itemId)));
    }
    private void validateReturnQuantity(MesWmReturnVendorDO returnVendor, Long lineId, Long itemId, BigDecimal quantity) {
        if (returnVendor.getPurchaseOrderId() == null) {
            return;
        }
        List<ErpPurchaseOrderItemRespDTO> orderItems = purchaseOrderApi
                .getPurchaseOrderItemList(returnVendor.getPurchaseOrderId()).getCheckedData();
        List<ErpPurchaseOrderItemRespDTO> matching = (CollUtil.isEmpty(orderItems) ? List.<ErpPurchaseOrderItemRespDTO>of() : orderItems).stream()
                .filter(item -> ObjUtil.equal(item.getProductId(), itemId)).toList();
        if (matching.size() > 1) {
            throw exception(WM_RETURN_VENDOR_PURCHASE_ITEM_AMBIGUOUS, itemId);
        }
        if (matching.isEmpty()) {
            throw exception(WM_RETURN_VENDOR_ITEM_NOT_IN_PURCHASE_ORDER);
        }
        ErpPurchaseOrderItemRespDTO item = matching.get(0);
        BigDecimal available = (item.getInCount() == null ? BigDecimal.ZERO : item.getInCount())
                .subtract(item.getReturnCount() == null ? BigDecimal.ZERO : item.getReturnCount());
        BigDecimal totalQuantity = quantity;
        for (MesWmReturnVendorLineDO existing : returnVendorLineServiceList(returnVendor.getId())) {
            if (!ObjUtil.equal(existing.getId(), lineId) && ObjUtil.equal(existing.getItemId(), itemId)
                    && existing.getQuantity() != null) {
                totalQuantity = totalQuantity.add(existing.getQuantity());
            }
        }
        if (totalQuantity.compareTo(available) > 0) {
            throw exception(WM_RETURN_VENDOR_QUANTITY_EXCEED, itemId, totalQuantity, available);
        }
    }
    private List<MesWmReturnVendorLineDO> returnVendorLineServiceList(Long returnId) {
        return returnVendorLineMapper.selectListByReturnId(returnId);
    }
    /**
     * 解析采购订单号,解析失败时回退为可读 ID
     */