gaoluyang
17 小时以前 bc9d77f6061a5c7f7deceaabc7c5ed6c17ad8c2f
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java
@@ -106,7 +106,7 @@
        // 1.2 校验来源单据参数,并验证数据存在
        String sourceDocCode = validateAndGetSourceDocCode(
                createReqVO.getSourceDocType(), createReqVO.getSourceDocId(), createReqVO.getSourceLineId());
        // 1.3 确定质检方案:显式指定时校验方案本身可用(不要求与产品物料绑定);未指定时按物料已绑定方案兜底
        // 1.3 确定质检方案:质检方案与产品物料不绑定,显式指定时只校验方案本身可用;未指定时走默认方案解析
        Long templateId;
        if (createReqVO.getTemplateId() != null) {
            MesQcTemplateDO template = templateService.getTemplate(createReqVO.getTemplateId());
@@ -122,8 +122,7 @@
            }
            templateId = template.getId();
        } else {
            templateId = templateItemService.getRequiredTemplateByItemIdAndType(
                    createReqVO.getItemId(), MesQcTypeEnum.IQC.getType()).getTemplateId();
            templateId = resolveDefaultIqcTemplateId(createReqVO.getItemId());
        }
        // 2. 插入主表
@@ -385,17 +384,8 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createIqcFromArrivalNotice(Long noticeId, MesWmArrivalNoticeLineDO line, String noticeCode, Long vendorId) {
        // 1. 校验物料是否配置了 IQC 检验模板
        MesQcTemplateItemDO templateItem;
        try {
            templateItem = templateItemService.getRequiredTemplateByItemIdAndType(
                    line.getItemId(), MesQcTypeEnum.IQC.getType());
        } catch (Exception e) {
            // 获取物料信息,提供更明确的错误提示
            String itemInfo = getItemInfo(line.getItemId());
            throw exception(QC_NO_TEMPLATE_FOR_ITEM, itemInfo);
        }
        Long templateId = templateItem.getTemplateId();
        // 1. 确定质检方案:质检方案与产品物料不绑定,物料未绑定方案时取任一启用的来料检验方案
        Long templateId = resolveDefaultIqcTemplateId(line.getItemId());
        // 2. 生成检验单编码
        String code = "IQC" + System.currentTimeMillis();
@@ -426,21 +416,28 @@
    }
    /**
     * 获取物料信息(编码+名称)
     * 解析来料检验的默认质检方案:质检方案与产品物料不绑定。
     *
     * 1. 物料已绑定来料检验方案时,优先沿用(兼容存量配置);
     * 2. 物料未绑定时,取任一启用且检测种类包含来料检验的方案(按编号取最早创建的一个)。
     *
     * @param itemId 产品物料编号
     * @return 质检方案编号
     */
    private String getItemInfo(Long itemId) {
        if (itemId == null) {
            return "未知物料";
    private Long resolveDefaultIqcTemplateId(Long itemId) {
        List<MesQcTemplateItemDO> boundList = templateItemService.getTemplateItemList(
                itemId, MesQcTypeEnum.IQC.getType(), null, null);
        if (CollUtil.isNotEmpty(boundList)) {
            return boundList.get(0).getTemplateId();
        }
        try {
            cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO item = mdmItemApi.getItem(itemId).getCheckedData();
            if (item != null) {
                return item.getCode() + "-" + item.getName();
            }
        } catch (Exception e) {
            // 忽略异常
        List<MesQcTemplateDO> enabledTemplates = templateService.getEnabledTemplateListByType(MesQcTypeEnum.IQC.getType());
        if (CollUtil.isEmpty(enabledTemplates)) {
            throw exception(QC_IQC_NO_ENABLED_TEMPLATE);
        }
        return "物料ID:" + itemId;
        return enabledTemplates.stream()
                .map(MesQcTemplateDO::getId)
                .min(Comparator.naturalOrder())
                .orElseThrow(() -> exception(QC_IQC_NO_ENABLED_TEMPLATE));
    }
    @Override