gaoluyang
昨天 8c65f898ed6e5b0c7a94c792c4562f6ec831dccd
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java
@@ -22,6 +22,7 @@
import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcService;
import cn.iocoder.yudao.module.mes.service.qc.rqc.MesQcRqcService;
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@@ -67,6 +68,12 @@
    @Resource
    private DictDataApi dictDataApi;
    @Resource
    private StorageAttachmentApi storageAttachmentApi;
    /** 过程检验行附件的存储关联类型(与 MesQcAttachmentController 保持一致) */
    private static final String IPQC_DETAIL_RECORD_TYPE = "mes_qc_ipqc_detail_attachment";
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createIndicatorResult(MesQcIndicatorResultSaveReqVO createReqVO) {
@@ -103,6 +110,27 @@
        List<MesQcIndicatorResultDetailDO> details = BeanUtils.toBean(updateReqVO.getItems(),
                MesQcIndicatorResultDetailDO.class);
        resultDetailService.createOrUpdateDetailList(details);
        // 2.3 过程检验支持手工增删检验行:删除本次未提交的明细,并清理其行附件关联
        if (MesQcTypeEnum.IPQC.getType().equals(updateReqVO.getQcType())) {
            deleteIndicatorDetailsRemoved(updateReqVO.getId(), updateReqVO.getItems());
        }
    }
    /**
     * 删除本次保存中已被移除的过程检验行(行附件一并解绑)
     */
    private void deleteIndicatorDetailsRemoved(Long resultId, List<MesQcIndicatorResultSaveReqVO.Item> items) {
        Set<Long> keepIds = convertSet(items, MesQcIndicatorResultSaveReqVO.Item::getId);
        List<Long> removedIds = resultDetailService.getDetailListByResultId(resultId).stream()
                .map(MesQcIndicatorResultDetailDO::getId)
                .filter(id -> id != null && !keepIds.contains(id))
                .toList();
        if (CollUtil.isEmpty(removedIds)) {
            return;
        }
        removedIds.forEach(detailId ->
                storageAttachmentApi.bindAttachments("file", IPQC_DETAIL_RECORD_TYPE, detailId, Collections.emptyList()));
        resultDetailService.deleteDetailList(removedIds);
    }
    @Override