云
4 天以前 f02d0df2f1dfc7a8b775cf50d45375e57628a5ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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();
    }
}