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);
|
}
|
}
|
|
}
|