diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java index 790a9bf..3b3143a 100644 --- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java +++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java @@ -81,6 +81,8 @@ public interface ErrorCodeConstants { ErrorCode PRODUCT_NOT_EXISTS = new ErrorCode(1_020_008_000, "产品不存在"); ErrorCode PRODUCT_NO_EXISTS = new ErrorCode(1_020_008_001, "产品编号已存在"); ErrorCode PRODUCT_NOT_ENABLE = new ErrorCode(1_020_008_002, "产品【{}】已禁用"); + ErrorCode PRODUCT_DELETE_FAIL_CONTRACT_EXISTS = new ErrorCode(1_020_008_003, "产品已被合同引用,无法删除"); + ErrorCode PRODUCT_DELETE_FAIL_BUSINESS_EXISTS = new ErrorCode(1_020_008_004, "产品已被商机引用,无法删除"); // ========== 产品分类 1_020_009_000 ========== ErrorCode PRODUCT_CATEGORY_NOT_EXISTS = new ErrorCode(1_020_009_000, "产品分类不存在"); diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java index e45c4db..2629bd6 100644 --- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java +++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java @@ -5,8 +5,12 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductPageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductSaveReqVO; +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessProductDO; +import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractProductDO; import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO; import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO; +import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessProductMapper; +import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractProductMapper; import cn.iocoder.yudao.module.crm.dal.mysql.product.CrmProductMapper; import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; @@ -49,6 +53,10 @@ public class CrmProductServiceImpl implements CrmProductService { @Resource private CrmProductCategoryService productCategoryService; @Resource + private CrmContractProductMapper contractProductMapper; + @Resource + private CrmBusinessProductMapper businessProductMapper; + @Resource private CrmPermissionService permissionService; @Resource @@ -128,6 +136,13 @@ public class CrmProductServiceImpl implements CrmProductService { public void deleteProduct(Long id) { // 校验存在 validateProductExists(id); + // 校验未被合同/商机引用,避免删除后产生悬空引用 + if (contractProductMapper.selectCount(CrmContractProductDO::getProductId, id) > 0) { + throw exception(PRODUCT_DELETE_FAIL_CONTRACT_EXISTS); + } + if (businessProductMapper.selectCount(CrmBusinessProductDO::getProductId, id) > 0) { + throw exception(PRODUCT_DELETE_FAIL_BUSINESS_EXISTS); + } // 删除 productMapper.deleteById(id); } diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java index 65f64c2..af735a9 100644 --- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java +++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java @@ -130,6 +130,12 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00 // ========== ERP 产品 1-030-500-000 ========== ErrorCode PRODUCT_NOT_EXISTS = new ErrorCode(1_030_500_000, "产品不存在"); ErrorCode PRODUCT_NOT_ENABLE = new ErrorCode(1_030_500_001, "产品({})未启用"); + ErrorCode PRODUCT_DELETE_FAIL_PURCHASE_ORDER_EXISTS = new ErrorCode(1_030_500_002, "产品已被采购订单引用,无法删除"); + ErrorCode PRODUCT_DELETE_FAIL_PURCHASE_IN_EXISTS = new ErrorCode(1_030_500_003, "产品已被采购入库单引用,无法删除"); + ErrorCode PRODUCT_DELETE_FAIL_PURCHASE_RETURN_EXISTS = new ErrorCode(1_030_500_004, "产品已被采购退货单引用,无法删除"); + ErrorCode PRODUCT_DELETE_FAIL_SALE_ORDER_EXISTS = new ErrorCode(1_030_500_005, "产品已被销售订单引用,无法删除"); + ErrorCode PRODUCT_DELETE_FAIL_SALE_OUT_EXISTS = new ErrorCode(1_030_500_006, "产品已被销售出库单引用,无法删除"); + ErrorCode PRODUCT_DELETE_FAIL_SALE_RETURN_EXISTS = new ErrorCode(1_030_500_007, "产品已被销售退货单引用,无法删除"); // ========== ERP 产品分类 1-030-501-000 ========== ErrorCode PRODUCT_CATEGORY_NOT_EXISTS = new ErrorCode(1_030_501_000, "产品分类不存在"); diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java index 88599a8..0193a87 100644 --- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java +++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java @@ -11,7 +11,19 @@ import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductSa import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductCategoryDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInItemDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnItemDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOutItemDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleReturnItemDO; import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseInItemMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseOrderItemMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseReturnItemMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderItemMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOutItemMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleReturnItemMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -38,6 +50,18 @@ public class ErpProductServiceImpl implements ErpProductService { private ErpProductCategoryService productCategoryService; @Resource private ErpProductUnitService productUnitService; + @Resource + private ErpPurchaseOrderItemMapper purchaseOrderItemMapper; + @Resource + private ErpPurchaseInItemMapper purchaseInItemMapper; + @Resource + private ErpPurchaseReturnItemMapper purchaseReturnItemMapper; + @Resource + private ErpSaleOrderItemMapper saleOrderItemMapper; + @Resource + private ErpSaleOutItemMapper saleOutItemMapper; + @Resource + private ErpSaleReturnItemMapper saleReturnItemMapper; @Override public Long createProduct(ProductSaveReqVO createReqVO) { @@ -63,6 +87,25 @@ public class ErpProductServiceImpl implements ErpProductService { public void deleteProduct(Long id) { // 校验存在 validateProductExists(id); + // 校验未被任何业务单据明细引用,避免删除后产生悬空引用 + if (purchaseOrderItemMapper.selectCount(ErpPurchaseOrderItemDO::getProductId, id) > 0) { + throw exception(PRODUCT_DELETE_FAIL_PURCHASE_ORDER_EXISTS); + } + if (purchaseInItemMapper.selectCount(ErpPurchaseInItemDO::getProductId, id) > 0) { + throw exception(PRODUCT_DELETE_FAIL_PURCHASE_IN_EXISTS); + } + if (purchaseReturnItemMapper.selectCount(ErpPurchaseReturnItemDO::getProductId, id) > 0) { + throw exception(PRODUCT_DELETE_FAIL_PURCHASE_RETURN_EXISTS); + } + if (saleOrderItemMapper.selectCount(ErpSaleOrderItemDO::getProductId, id) > 0) { + throw exception(PRODUCT_DELETE_FAIL_SALE_ORDER_EXISTS); + } + if (saleOutItemMapper.selectCount(ErpSaleOutItemDO::getProductId, id) > 0) { + throw exception(PRODUCT_DELETE_FAIL_SALE_OUT_EXISTS); + } + if (saleReturnItemMapper.selectCount(ErpSaleReturnItemDO::getProductId, id) > 0) { + throw exception(PRODUCT_DELETE_FAIL_SALE_RETURN_EXISTS); + } // 删除 productMapper.deleteById(id); }