package cn.iocoder.yudao.module.srm.service.supplier; 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.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.srm.controller.admin.supplier.vo.SrmSupplierPageReqVO; import cn.iocoder.yudao.module.srm.controller.admin.supplier.vo.SrmSupplierSaveReqVO; import cn.iocoder.yudao.module.srm.dal.dataobject.*; import cn.iocoder.yudao.module.srm.dal.mysql.SrmBidAwardMapper; import cn.iocoder.yudao.module.srm.dal.mysql.SrmBidEvaluationMapper; import cn.iocoder.yudao.module.srm.dal.mysql.SrmSupplierApplyMapper; import cn.iocoder.yudao.module.srm.dal.mysql.SrmSupplierCategoryMapper; import cn.iocoder.yudao.module.srm.dal.mysql.SrmSupplierContactMapper; import cn.iocoder.yudao.module.srm.dal.mysql.SrmSupplierCertificateMapper; import cn.iocoder.yudao.module.srm.dal.mysql.SrmSupplierMapper; import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderBidMapper; import cn.iocoder.yudao.module.srm.enums.ErrorCodeConstants; import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.hutool.core.collection.CollUtil; import java.util.Collection; import java.util.Collections; import java.util.List; @Service @Validated public class SrmSupplierServiceImpl implements SrmSupplierService { @Resource private SrmSupplierMapper supplierMapper; @Resource private SrmSupplierContactMapper supplierContactMapper; @Resource private SrmSupplierCategoryMapper supplierCategoryMapper; @Resource private SrmSupplierApplyMapper supplierApplyMapper; @Resource private SrmSupplierCertificateMapper supplierCertificateMapper; @Resource private SrmTenderBidMapper tenderBidMapper; @Resource private SrmBidEvaluationMapper bidEvaluationMapper; @Resource private SrmBidAwardMapper bidAwardMapper; @Override public Long createSupplier(SrmSupplierSaveReqVO createReqVO) { // 校验供应商编码唯一性 validateCodeUnique(createReqVO.getCode(), null); // 插入 SrmSupplierDO supplier = BeanUtils.toBean(createReqVO, SrmSupplierDO.class); supplierMapper.insert(supplier); return supplier.getId(); } @Override public void updateSupplier(SrmSupplierSaveReqVO updateReqVO) { // 校验存在性 validateSupplierExists(updateReqVO.getId()); // 校验编码唯一性 validateCodeUnique(updateReqVO.getCode(), updateReqVO.getId()); // 更新 SrmSupplierDO updateObj = BeanUtils.toBean(updateReqVO, SrmSupplierDO.class); supplierMapper.updateById(updateObj); } @Override @Transactional(rollbackFor = Exception.class) public void deleteSupplier(Long id) { // 校验存在性 validateSupplierExists(id); // 关联数据存在时,不允许删除 validateNoReference(id); // 可直接清理的关联数据 supplierContactMapper.deleteBySupplierId(id); supplierCategoryMapper.deleteBySupplierId(id); // 逻辑删除 supplierMapper.deleteById(id); } @Override public SrmSupplierDO getSupplier(Long id) { return supplierMapper.selectById(id); } @Override public PageResult getSupplierPage(SrmSupplierPageReqVO pageReqVO) { return supplierMapper.selectPage(pageReqVO); } @Override public List getSupplierSimpleList() { return supplierMapper.selectApprovedList(); } @Override public List getSupplierAllList() { return supplierMapper.selectList(new LambdaQueryWrapperX() .orderByAsc(SrmSupplierDO::getId)); } @Override public List getSupplierList(Collection ids) { if (CollUtil.isEmpty(ids)) { return Collections.emptyList(); } return supplierMapper.selectBatchIds(ids); } // ========== 校验方法 ========== private void validateSupplierExists(Long id) { if (supplierMapper.selectById(id) == null) { throw ServiceExceptionUtil.exception(ErrorCodeConstants.SUPPLIER_NOT_EXISTS); } } private void validateCodeUnique(String code, Long id) { SrmSupplierDO existing = supplierMapper.selectByCode(code); if (existing != null && !existing.getId().equals(id)) { throw ServiceExceptionUtil.exception(ErrorCodeConstants.SUPPLIER_CODE_EXISTS); } } private void validateNoReference(Long id) { boolean hasReference = supplierApplyMapper.existsApprovedBySupplierId(id) || supplierCertificateMapper.selectCount(SrmSupplierCertificateDO::getSupplierId, id) > 0 || tenderBidMapper.selectCount(SrmTenderBidDO::getSupplierId, id) > 0 || bidEvaluationMapper.selectCount(SrmBidEvaluationDO::getSupplierId, id) > 0 || bidAwardMapper.selectCount(SrmBidAwardDO::getSupplierId, id) > 0; if (hasReference) { throw ServiceExceptionUtil.exception(ErrorCodeConstants.SUPPLIER_EXISTS_REFERENCE); } } }