| | |
| | | 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 实现类 |
| | |
| | | private MesWmBatchService batchService; |
| | | @Resource |
| | | private ErpPurchaseOrderApi purchaseOrderApi; |
| | | @Resource |
| | | private MesWmItemUnitConvertService itemUnitConvertService; |
| | | |
| | | @Override |
| | | public Long createReturnVendorLine(MesWmReturnVendorLineSaveReqVO createReqVO) { |
| | |
| | | MesWmReturnVendorDO returnVendor = validateReturnVendorLineSaveData(createReqVO); |
| | | // 退货单若已关联采购订单,物料必须属于该采购订单,禁止跨订单随意选料 |
| | | validateReturnVendorItemInPurchaseOrder(returnVendor, createReqVO.getItemId(), null); |
| | | // 双单位换算:按录入单位换算为物料主单位数量 |
| | | fillPrimaryQuantity(createReqVO); |
| | | |
| | | // 插入 |
| | | MesWmReturnVendorLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnVendorLineDO.class); |
| | |
| | | MesWmReturnVendorDO returnVendor = validateReturnVendorLineSaveData(updateReqVO); |
| | | // 关联采购订单时,不允许把行物料改成订单外的物料;仅改数量等操作不受影响 |
| | | validateReturnVendorItemInPurchaseOrder(returnVendor, updateReqVO.getItemId(), oldLine.getItemId()); |
| | | // 双单位换算:按录入单位换算为物料主单位数量 |
| | | fillPrimaryQuantity(updateReqVO); |
| | | |
| | | // 更新 |
| | | MesWmReturnVendorLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorLineDO.class); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 双单位换算:选择了录入单位时,按「录入数量 × 换算比率」得到物料主单位口径的退货数量 |
| | | * |
| | | * 未按辅单位录入时必须直接填写退货数量 |
| | | */ |
| | | 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); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 校验退货行物料属于所关联采购订单(退货单已关联采购订单时)。 |
| | | * |
| | | * 采购退货的物料应取自关联采购订单,此处为后端兜底,防止通过接口跨订单随意选料。 |