云
22 小时以前 ac2e2b5af3726ee64dc37c3ebf26989a0346f22a
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java
@@ -10,6 +10,8 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnissue.MesWmReturnIssueLineDO;
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.enums.qc.MesQcStatusEnum;
import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum;
@@ -40,6 +42,7 @@
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.rqc.vo.MesQcRqcImportRespVO;
@@ -119,6 +122,13 @@
                .setTemplateId(templateId)
                .setSourceDocCode(sourceDocCode)
                .setStatus(MesQcStatusEnum.DRAFT.getStatus());
        // 检测人员、检测日期未填写时使用默认值,不影响流程
        if (rqc.getInspectorUserId() == null) {
            rqc.setInspectorUserId(getLoginUserId());
        }
        if (rqc.getInspectDate() == null) {
            rqc.setInspectDate(LocalDateTime.now());
        }
        rqcMapper.insert(rqc);
        // 3. 从模板指标自动生成检验行
@@ -146,7 +156,10 @@
        validateRqcCodeUnique(reqVO.getId(), reqVO.getCode());
        // 校验物料、检测人员存在(兼容 mdm_item.id / mes_md_item.id)
        qcItemResolver.validateItemExists(reqVO.getItemId());
        adminUserApi.validateUser(reqVO.getInspectorUserId());
        // 校验检测人员存在(非必填,未填写时由创建逻辑默认当前登录人)
        if (reqVO.getInspectorUserId() != null) {
            adminUserApi.validateUser(reqVO.getInspectorUserId());
        }
    }
    @Override
@@ -166,7 +179,9 @@
                throw exception(QC_RQC_QUANTITY_MISMATCH);
            }
        }
        // 1.4 校验至少存在一条检测结果
        // 1.4 校验检测数量与来源退货行数量一致,避免回写时覆盖来源行数量
        validateSourceLineQuantity(rqc);
        // 1.5 校验至少存在一条检测结果
        indicatorResultService.validateIndicatorResultExistsByQcIdAndType(id, MesQcTypeEnum.RQC.getType());
        // 2. 更新状态为已完成
@@ -178,6 +193,33 @@
        // 4. 回写来源单据
        writeBackSourceDoc(rqc);
    }
    /**
     * 校验检测数量与来源退货行数量一致
     *
     * <p>回写来源单据时会用合格/不合格数量重写行的数量,若检测数量与来源行不一致会静默改变退货数量,
     * 因此完成检验前必须保证两者相等。
     */
    private void validateSourceLineQuantity(MesQcRqcDO rqc) {
        if (rqc.getSourceDocType() == null || rqc.getSourceLineId() == null || rqc.getCheckQuantity() == null) {
            return;
        }
        BigDecimal sourceQuantity = null;
        if (Objects.equals(rqc.getSourceDocType(), MesBizTypeConstants.WM_RETURN_ISSUE)) {
            MesWmReturnIssueLineDO line = returnIssueLineService.getReturnIssueLine(rqc.getSourceLineId());
            if (line != null) {
                sourceQuantity = line.getQuantity();
            }
        } else if (Objects.equals(rqc.getSourceDocType(), MesBizTypeConstants.WM_RETURN_SALES)) {
            MesWmReturnSalesLineDO line = returnSalesLineService.getReturnSalesLine(rqc.getSourceLineId());
            if (line != null) {
                sourceQuantity = line.getQuantity();
            }
        }
        if (sourceQuantity != null && rqc.getCheckQuantity().compareTo(sourceQuantity) != 0) {
            throw exception(QC_RQC_SOURCE_QUANTITY_INVALID, sourceQuantity.stripTrailingZeros().toPlainString());
        }
    }
    /**
@@ -216,8 +258,7 @@
            return;
        }
        if (rqc.getSourceLineId() == null) {
            throw new IllegalArgumentException(
                    "RQC 单[" + rqc.getId() + "] sourceDocType 非空但 sourceLineId 为空");
            throw exception(QC_RQC_SOURCE_LINE_REQUIRED);
        }
        if (Objects.equals(rqc.getSourceDocType(), MesBizTypeConstants.WM_RETURN_ISSUE)) {
@@ -231,8 +272,7 @@
                    rqc.getSourceLineId(), rqc.getSourceDocId(), rqc.getCheckResult(),
                    rqc.getQualifiedQuantity(), rqc.getUnqualifiedQuantity());
        } else {
            throw new IllegalArgumentException(
                    "RQC 单[" + rqc.getId() + "] sourceDocType=" + rqc.getSourceDocType() + " 无法识别,无法回写来源单据");
            throw exception(QC_RQC_SOURCE_DOC_TYPE_UNKNOWN, rqc.getSourceDocType());
        }
    }