云
2026-10-28 dd637406e18a7afbf08d323c6ece913fe545b7ad
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.mes.service.qc.rqc;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -89,9 +90,21 @@
    public Long createRqc(MesQcRqcSaveReqVO createReqVO) {
        // 1.1 校验数据
        validateRqcSaveData(createReqVO);
        // 1.2 根据物料 + 检验类型自动匹配模板
        MesQcTemplateItemDO templateItem = templateItemService.getRequiredTemplateByItemIdAndType(
                createReqVO.getItemId(), createReqVO.getType());
        // 1.2 根据物料 + RQC 检测种类查找可用质检方案(支持前端显式指定)
        List<MesQcTemplateItemDO> templateItems = templateItemService.getTemplateItemList(
                createReqVO.getItemId(), MesQcTypeEnum.RQC.getType(), null, null);
        if (CollUtil.isEmpty(templateItems)) {
            throw exception(QC_NO_TEMPLATE);
        }
        MesQcTemplateItemDO templateItem = templateItems.get(0);
        if (createReqVO.getTemplateId() != null) {
            templateItem = templateItems.stream()
                    .filter(available -> Objects.equals(available.getTemplateId(), createReqVO.getTemplateId()))
                    .findFirst().orElse(null);
            if (templateItem == null) {
                throw exception(QC_NO_TEMPLATE); // 指定了方案但不在匹配列表中,拒绝
            }
        }
        Long templateId = templateItem.getTemplateId();
        // 1.3 获取来源单据编号
        String sourceDocCode = validateAndGetSourceDocCode(
@@ -102,6 +115,15 @@
                .setTemplateId(templateId)
                .setSourceDocCode(sourceDocCode)
                .setStatus(MesQcStatusEnum.DRAFT.getStatus());
        if (Objects.equals(createReqVO.getSourceDocType(), MesBizTypeConstants.WM_RETURN_SALES)
                && createReqVO.getSourceLineId() != null) {
            var line = returnSalesLineService.validateReturnSalesLineExists(createReqVO.getSourceLineId());
            if (!Objects.equals(line.getReturnId(), createReqVO.getSourceDocId())
                    || !Objects.equals(line.getItemId(), createReqVO.getItemId())) {
                throw exception(WM_RETURN_SALES_DETAIL_SOURCE_MISMATCH);
            }
            rqc.setBatchCode(line.getBatchCode());
        }
        rqcMapper.insert(rqc);
        // 3. 从模板指标自动生成检验行
@@ -112,7 +134,7 @@
    @Override
    public void updateRqc(MesQcRqcSaveReqVO updateReqVO) {
        // 1.1 校验存在 + 草稿状态
        validateRqcStatusPrepare(updateReqVO.getId());
        MesQcRqcDO existingRqc = validateRqcStatusPrepare(updateReqVO.getId());
        // 1.2 校验数据
        validateRqcSaveData(updateReqVO);
@@ -121,6 +143,8 @@
        updateObj.setSourceDocType(null).setSourceDocId(null).setSourceLineId(null); // 不允许修改来源单据
        updateObj.setTemplateId(null); // 不允许修改模板
        updateObj.setItemId(null); // 不允许修改物料
        if (Objects.equals(existingRqc.getSourceDocType(), MesBizTypeConstants.WM_RETURN_SALES)
                && existingRqc.getSourceLineId() != null) updateObj.setBatchCode(null);
        rqcMapper.updateById(updateObj);
    }