package cn.iocoder.yudao.module.mes.service.qc.ncr;
|
|
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ncr.MesQcNcrDO;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcDO;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO;
|
import cn.iocoder.yudao.module.mes.dal.mysql.qc.rqc.MesQcRqcMapper;
|
import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesMapper;
|
import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper;
|
import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesDetailMapper;
|
import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
|
import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
|
import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum;
|
import jakarta.annotation.Resource;
|
import org.springframework.stereotype.Service;
|
import java.util.List;
|
import java.util.Objects;
|
|
/** 在调用方事务内把客户退货的不合格行整行转交 NCR。 */
|
@Service
|
public class MesQcNcrReturnSalesLink {
|
@Resource private MesQcRqcMapper rqcMapper;
|
@Resource private MesWmReturnSalesMapper salesMapper;
|
@Resource private MesWmReturnSalesLineMapper lineMapper;
|
@Resource private MesWmReturnSalesDetailMapper detailMapper;
|
|
public String claim(MesQcNcrDO ncr) {
|
MesQcRqcDO qc = rqcMapper.selectById(ncr.getQcId());
|
if (qc == null || !Objects.equals(qc.getSourceDocType(), MesBizTypeConstants.WM_RETURN_SALES)
|
|| qc.getSourceDocId() == null || qc.getSourceLineId() == null
|
|| !Objects.equals(qc.getItemId(), ncr.getItemId())
|
|| qc.getUnqualifiedQuantity() == null || ncr.getUnqualifiedQuantity() == null
|
|| qc.getUnqualifiedQuantity().compareTo(ncr.getUnqualifiedQuantity()) != 0) {
|
throw new ServiceException(400, "退货检验不合格处理仅支持可追溯的客户销售退货,物料和数量须与检验单一致");
|
}
|
MesWmReturnSalesDO sales = salesMapper.selectOne(new LambdaQueryWrapperX<MesWmReturnSalesDO>()
|
.eq(MesWmReturnSalesDO::getId, qc.getSourceDocId()).last("FOR UPDATE"));
|
if (sales == null || Objects.equals(sales.getStatus(), MesWmReturnSalesStatusEnum.FINISHED.getStatus())
|
|| Objects.equals(sales.getStatus(), MesWmReturnSalesStatusEnum.CANCELED.getStatus())) {
|
throw new ServiceException(400, "来源销售退货单不存在或已完成/取消,不能转交处置");
|
}
|
List<MesWmReturnSalesLineDO> lines = lineMapper.selectList(new LambdaQueryWrapperX<MesWmReturnSalesLineDO>()
|
.eq(MesWmReturnSalesLineDO::getReturnId, sales.getId())
|
.eq(MesWmReturnSalesLineDO::getRqcId, qc.getId())
|
.eq(MesWmReturnSalesLineDO::getQualityStatus, MesWmQualityStatusEnum.FAIL.getStatus())
|
.last("FOR UPDATE"));
|
if (lines.size() != 1) {
|
throw new ServiceException(400, "无法唯一定位退货检验对应的不合格行,请核对来源关联");
|
}
|
MesWmReturnSalesLineDO line = lines.get(0);
|
if (line.getNcrDispositionId() != null || !Objects.equals(line.getItemId(), ncr.getItemId())
|
|| line.getQuantity() == null || line.getQuantity().compareTo(ncr.getUnqualifiedQuantity()) != 0
|
|| !detailMapper.selectListByLineId(line.getId()).isEmpty()) {
|
throw new ServiceException(400, "退货不合格行已被处理、数量不一致或已有入库明细,不能重复处置");
|
}
|
lineMapper.updateById(new MesWmReturnSalesLineDO().setId(line.getId()).setNcrDispositionId(ncr.getId()));
|
return line.getBatchCode();
|
}
|
}
|