gaoluyang
17 小时以前 bc9d77f6061a5c7f7deceaabc7c5ed6c17ad8c2f
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java
@@ -18,18 +18,21 @@
import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorLineMapper;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
import cn.iocoder.yudao.module.mes.service.wm.unitconvert.MesWmItemUnitConvertService;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;
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_LINE_QUANTITY_REQUIRED;
/**
 * MES 供应商退货单行 Service 实现类
@@ -53,6 +56,8 @@
    private MesWmBatchService batchService;
    @Resource
    private ErpPurchaseOrderApi purchaseOrderApi;
    @Resource
    private MesWmItemUnitConvertService itemUnitConvertService;
    @Override
    public Long createReturnVendorLine(MesWmReturnVendorLineSaveReqVO createReqVO) {
@@ -60,6 +65,8 @@
        MesWmReturnVendorDO returnVendor = validateReturnVendorLineSaveData(createReqVO);
        // 退货单若已关联采购订单,物料必须属于该采购订单,禁止跨订单随意选料
        validateReturnVendorItemInPurchaseOrder(returnVendor, createReqVO.getItemId(), null);
        // 双单位换算:按录入单位换算为物料主单位数量
        fillPrimaryQuantity(createReqVO);
        // 插入
        MesWmReturnVendorLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnVendorLineDO.class);
@@ -77,6 +84,8 @@
        MesWmReturnVendorDO returnVendor = validateReturnVendorLineSaveData(updateReqVO);
        // 关联采购订单时,不允许把行物料改成订单外的物料;仅改数量等操作不受影响
        validateReturnVendorItemInPurchaseOrder(returnVendor, updateReqVO.getItemId(), oldLine.getItemId());
        // 双单位换算:按录入单位换算为物料主单位数量
        fillPrimaryQuantity(updateReqVO);
        // 更新
        MesWmReturnVendorLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorLineDO.class);
@@ -139,6 +148,25 @@
    }
    /**
     * 双单位换算:选择了录入单位时,按「录入数量 × 换算比率」得到物料主单位口径的退货数量
     *
     * 未按辅单位录入时必须直接填写退货数量
     */
    private void fillPrimaryQuantity(MesWmReturnVendorLineSaveReqVO reqVO) {
        if (reqVO.getEnterUnitMeasureId() != null) {
            BigDecimal primaryQuantity = itemUnitConvertService.convertToPrimaryUnit(
                    reqVO.getItemId(), reqVO.getItemModelId(),
                    reqVO.getEnterUnitMeasureId(), reqVO.getEnterQuantity());
            if (primaryQuantity != null) {
                reqVO.setQuantity(primaryQuantity);
            }
        }
        if (reqVO.getQuantity() == null) {
            throw exception(WM_RETURN_VENDOR_LINE_QUANTITY_REQUIRED);
        }
    }
    /**
     * 校验退货行物料属于所关联采购订单(退货单已关联采购订单时)。
     *
     * 采购退货的物料应取自关联采购订单,此处为后端兜底,防止通过接口跨订单随意选料。