云
2 天以前 657698fd2fb32794932474648dbaee9e284e38c8
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java
@@ -6,6 +6,7 @@
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcPageReqVO;
@@ -35,6 +36,7 @@
import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import com.mzt.logapi.starter.annotation.LogRecord;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@@ -49,6 +51,7 @@
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.mes.enums.LogRecordConstants.*;
/**
 * MES 来料检验单(IQC) Service 实现类
@@ -148,11 +151,18 @@
    }
    private void validateIqcSaveData(MesQcIqcSaveReqVO reqVO) {
        // 空字符串也需要写入,以支持编辑时清空手填名称。
        if (reqVO.getVendorName() != null) {
            reqVO.setVendorName(reqVO.getVendorName().trim());
        }
        // 校验编号唯一
        validateIqcCodeUnique(reqVO.getId(), reqVO.getCode());
        // 校验供应商存在
        if (reqVO.getVendorId() != null) {
            srmSupplierApi.getSupplier(reqVO.getVendorId());
            var supplier = srmSupplierApi.getSupplier(reqVO.getVendorId()).getCheckedData();
            if (reqVO.getVendorName() == null && supplier != null) {
                reqVO.setVendorName(supplier.getName());
            }
        }
        // 校验物料存在(使用 MDM 物料)
        if (reqVO.getItemId() != null) {
@@ -402,6 +412,12 @@
        iqc.setSourceLineId(line.getId());
        iqc.setSourceDocCode(noticeCode);
        iqc.setVendorId(vendorId);
        if (vendorId != null) {
            var supplier = srmSupplierApi.getSupplier(vendorId).getCheckedData();
            if (supplier != null) {
                iqc.setVendorName(supplier.getName());
            }
        }
        iqc.setItemId(line.getItemId());
        iqc.setReceivedQuantity(line.getArrivalQuantity());
        iqc.setCheckQuantity(BigDecimal.ZERO); // 待填写
@@ -437,10 +453,14 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    @LogRecord(type = MES_QC_IQC_TYPE, subType = MES_QC_IQC_IMPORT_SUB_TYPE, bizNo = "0",
            success = MES_QC_IQC_IMPORT_SUCCESS)
    public MesQcImportRespVO importIqcList(List<MesQcIqcImportExcelVO> importList) {
        MesQcImportRespVO respVO = MesQcImportRespVO.builder()
                .createList(new ArrayList<>()).failureList(new LinkedHashMap<>()).build();
        if (CollUtil.isEmpty(importList)) {
            // 空文件也要给日志文案兜底,避免 {{#importSummary}} 取不到值
            OperateLogUtils.putImportSummary(respVO.getCreateList(), null, respVO.getFailureList());
            return respVO;
        }
        qcImportHelper.startImport();
@@ -464,6 +484,8 @@
                respVO.getFailureList().put(label, MesQcImportHelper.resolveImportErrorMessage(ex));
            }
        }
        // 记录导入结果汇总,供 @LogRecord 的 success 文案引用
        OperateLogUtils.putImportSummary(respVO.getCreateList(), null, respVO.getFailureList());
        return respVO;
    }
@@ -498,7 +520,7 @@
        }
        reqVO.setName(row.getName().trim());
        reqVO.setItemId(qcImportHelper.resolveItemId(row.getItemCode()));
        reqVO.setVendorId(qcImportHelper.resolveVendorId(row.getVendorName()));
        reqVO.setVendorName(StrUtil.trimToEmpty(row.getVendorName()));
        reqVO.setVendorBatch(StrUtil.trimToNull(row.getVendorBatch()));
        reqVO.setTemplateId(qcImportHelper.resolveTemplateId(row.getTemplateName()));
        // 3. 数量:合格品 + 不合格品 必须等于本次接收数量(接收数量留空则自动合计)
@@ -516,7 +538,7 @@
        reqVO.setReceiveDate(qcImportHelper.parseRequiredDateTime(row.getReceiveDate(), "来料日期"));
        reqVO.setRemark(StrUtil.trimToNull(row.getRemark()));
        // 5. 去重:同一 物料 + 供应商 + 供应商批次 + 来料日期 的来料检验单不可重复导入
        MesQcIqcDO duplicate = CollUtil.getFirst(iqcMapper.selectListByImportKey(reqVO.getItemId(), reqVO.getVendorId(),
        MesQcIqcDO duplicate = CollUtil.getFirst(iqcMapper.selectListByImportKey(reqVO.getItemId(), reqVO.getVendorName(),
                reqVO.getVendorBatch(), reqVO.getReceiveDate()));
        if (duplicate != null) {
            throw MesQcImportHelper.duplicateExistingException(buildImportKeyDesc(row), "来料检验单",