云
4 天以前 f02d0df2f1dfc7a8b775cf50d45375e57628a5ef
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java
@@ -4,7 +4,11 @@
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import cn.iocoder.yudao.module.aftersales.api.AfterSaleTicketApi;
import cn.iocoder.yudao.module.aftersales.api.dto.AfterSaleWarehouseReturnStageReqDTO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLinePageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO;
@@ -42,6 +46,9 @@
@Service
@Validated
public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineService {
    @Resource
    private AfterSaleTicketApi afterSaleTicketApi;
    @Resource
    private MesWmReturnSalesLineMapper returnSalesLineMapper;
@@ -113,6 +120,12 @@
                    MesWmProductSalesStatusEnum.FINISHED.getStatus()) == 0) {
                throw exception(WM_RETURN_SALES_BATCH_NOT_SHIPPED);
            }
            // 手工入库批次可能没有客户;仅在订单盘号及已完成出库都已验证后允许退货。
            if (batch != null && (batch.getClientId() != null || reelNumbers.isEmpty())) {
                batchService.validateBatchExists(batch.getId(), reqVO.getItemId(), returnSales.getClientId(), null);
            }
        } else if (batch != null) {
            batchService.validateBatchExists(batch.getId(), reqVO.getItemId(), returnSales.getClientId(), null);
        }
    }
@@ -179,7 +192,7 @@
    /**
     * 校验物料批次管理
     *
     * @param returnId 退货单ID
     * @param returnSales 退货单
     * @param itemId   物料ID
     * @param batchId  批次ID
     */
@@ -191,10 +204,24 @@
        }
        // 校验批次存在且属于当前物料和客户
        if (batchId != null) {
            // 从父单获取客户ID,校验批次归属
            return batchService.validateBatchExists(batchId, itemId, returnSales.getClientId(), null);
            return batchService.validateBatchExists(batchId, itemId);
        }
        return null;
    }
    @Override
    public void bindRqcForFinish(Long lineId, Long returnId, Long rqcId, Long itemId, BigDecimal checkQuantity) {
        MesWmReturnSalesLineDO line = returnSalesLineMapper.selectOne(new LambdaQueryWrapperX<MesWmReturnSalesLineDO>()
                .eq(MesWmReturnSalesLineDO::getId, lineId).last("FOR UPDATE"));
        if (line == null || !Objects.equals(line.getReturnId(), returnId)
                || !Objects.equals(line.getItemId(), itemId)
                || !Objects.equals(line.getQualityStatus(), MesWmQualityStatusEnum.PENDING.getStatus())
                || (line.getRqcId() != null && !Objects.equals(line.getRqcId(), rqcId))
                || line.getQuantity() == null || checkQuantity == null
                || line.getQuantity().compareTo(checkQuantity) != 0) {
            throw new ServiceException(400, "退货检验须对应唯一待检退货行,物料和检验数量必须与退货行一致");
        }
        returnSalesLineMapper.updateById(new MesWmReturnSalesLineDO().setId(lineId).setRqcId(rqcId));
    }
    @Override
@@ -241,6 +268,14 @@
                    line -> Objects.equals(line.getQualityStatus(), MesWmQualityStatusEnum.PENDING.getStatus()));
            if (allInspected) {
                returnSalesService.updateReturnSalesStatus(sourceDocId, MesWmReturnSalesStatusEnum.APPROVING.getStatus());
                MesWmReturnSalesDO returnSales = returnSalesService.getReturnSales(sourceDocId);
                if (returnSales != null && returnSales.getSaleOrderId() != null) {
                    afterSaleTicketApi.onWarehouseReturnQualityFinished(new AfterSaleWarehouseReturnStageReqDTO()
                            .setSaleOrderId(returnSales.getSaleOrderId())
                            .setReturnSalesId(returnSales.getId())
                            .setReturnSalesCode(returnSales.getCode())
                            .setQualityResult("全部待检行已完成检验"));
                }
            }
        }
    }