yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpSupplierContractServiceImpl.java
@@ -8,8 +8,10 @@
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpSupplierContractDO;
import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseOrderMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpSupplierContractMapper;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.util.Collection;
@@ -32,12 +34,18 @@
    /** 合同状态默认值:履行中 */
    private static final Integer STATUS_ACTIVE = 1;
    /** 附件关联的业务记录类型(合同附件) */
    private static final String RECORD_TYPE = "erp_supplier_contract";
    @Resource
    private ErpSupplierContractMapper contractMapper;
    @Resource
    private ErpPurchaseOrderMapper purchaseOrderMapper;
    @Resource
    private StorageAttachmentApi storageAttachmentApi;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createContract(ErpSupplierContractSaveReqVO createReqVO) {
        validateContractCodeUnique(null, createReqVO.getCode());
        ErpSupplierContractDO contract = BeanUtils.toBean(createReqVO, ErpSupplierContractDO.class);
@@ -45,18 +53,24 @@
            contract.setStatus(STATUS_ACTIVE);
        }
        contractMapper.insert(contract);
        // 绑定附件(合同扫描件等),文件与合同通过附件中间表关联
        storageAttachmentApi.bindAttachments("file", RECORD_TYPE, contract.getId(), createReqVO.getBlobIds());
        return contract.getId();
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateContract(ErpSupplierContractSaveReqVO updateReqVO) {
        validateContractExists(updateReqVO.getId());
        validateContractCodeUnique(updateReqVO.getId(), updateReqVO.getCode());
        ErpSupplierContractDO updateObj = BeanUtils.toBean(updateReqVO, ErpSupplierContractDO.class);
        contractMapper.updateById(updateObj);
        // 增量更新附件:只删除被移除的、只绑定新增的
        storageAttachmentApi.updateAttachments("file", RECORD_TYPE, updateReqVO.getId(), updateReqVO.getBlobIds());
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteContract(Long id) {
        validateContractExists(id);
        // 已关联采购订单的合同不允许删除,避免订单丢失合同追溯信息
@@ -65,6 +79,8 @@
            throw exception(SUPPLIER_CONTRACT_USED_BY_ORDER);
        }
        contractMapper.deleteById(id);
        // 同步清理合同附件关联
        storageAttachmentApi.deleteAttachmentsByRecord(RECORD_TYPE, id);
    }
    @Override