1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package cn.iocoder.yudao.module.erp.service.purchase;
 
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.contract.ErpSupplierContractPageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.contract.ErpSupplierContractSaveReqVO;
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;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
 
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*;
 
/**
 * ERP 供应商合同 Service 实现类
 *
 * @author 超级管理员
 */
@Service
@Validated
public class ErpSupplierContractServiceImpl implements ErpSupplierContractService {
 
    /** 合同状态默认值:履行中 */
    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);
        if (contract.getStatus() == null) {
            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);
        // 已关联采购订单的合同不允许删除,避免订单丢失合同追溯信息
        long orderCount = purchaseOrderMapper.selectCountByContractId(id);
        if (orderCount > 0) {
            throw exception(SUPPLIER_CONTRACT_USED_BY_ORDER);
        }
        contractMapper.deleteById(id);
        // 同步清理合同附件关联
        storageAttachmentApi.deleteAttachmentsByRecord(RECORD_TYPE, id);
    }
 
    @Override
    public ErpSupplierContractDO getContract(Long id) {
        return contractMapper.selectById(id);
    }
 
    @Override
    public PageResult<ErpSupplierContractDO> getContractPage(ErpSupplierContractPageReqVO pageReqVO) {
        return contractMapper.selectPage(pageReqVO);
    }
 
    @Override
    public List<ErpSupplierContractDO> getContractListBySupplierId(Long supplierId) {
        if (supplierId == null) {
            return Collections.emptyList();
        }
        return contractMapper.selectListBySupplierIds(Collections.singletonList(supplierId));
    }
 
    @Override
    public List<ErpSupplierContractDO> getContractList(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return Collections.emptyList();
        }
        return contractMapper.selectByIds(ids);
    }
 
    @Override
    public ErpSupplierContractDO validateContractExists(Long id) {
        ErpSupplierContractDO contract = contractMapper.selectById(id);
        if (contract == null) {
            throw exception(SUPPLIER_CONTRACT_NOT_EXISTS);
        }
        return contract;
    }
 
    private void validateContractCodeUnique(Long id, String code) {
        ErpSupplierContractDO contract = contractMapper.selectByCode(code);
        if (contract == null) {
            return;
        }
        if (!Objects.equals(contract.getId(), id)) {
            throw exception(SUPPLIER_CONTRACT_CODE_DUPLICATE);
        }
    }
 
}