| | |
| | | |
| | | 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 实现类 |
| | |
| | | MesWmReturnVendorDO returnVendor = validateReturnVendorLineSaveData(createReqVO); |
| | | // 退货单若已关联采购订单,物料必须属于该采购订单,禁止跨订单随意选料 |
| | | validateReturnVendorItemInPurchaseOrder(returnVendor, createReqVO.getItemId(), null); |
| | | validateReturnQuantity(returnVendor, null, createReqVO.getItemId(), createReqVO.getQuantity()); |
| | | |
| | | // 插入 |
| | | MesWmReturnVendorLineDO line = BeanUtils.toBean(createReqVO, MesWmReturnVendorLineDO.class); |
| | |
| | | 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); |
| | |
| | | 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 |
| | | */ |