Commit 9f3b274ba9fa0e1637301a7573ac65e979c468a5

Authored by YunaiV
1 parent 13fd48ee

[BUG] CRM/ERP:产品删除无引用校验——被业务单据引用的产品可被直接软删,留下悬空引用 #1242

Showing 18 changed files with 145 additions and 38 deletions
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessService.java
@@ -165,6 +165,14 @@ public interface CrmBusinessService { @@ -165,6 +165,14 @@ public interface CrmBusinessService {
165 Long getBusinessCountByCustomerId(Long customerId); 165 Long getBusinessCountByCustomerId(Long customerId);
166 166
167 /** 167 /**
  168 + * 获得引用指定产品的商机产品数量
  169 + *
  170 + * @param productId 产品编号
  171 + * @return 数量
  172 + */
  173 + Long getBusinessProductCountByProductId(Long productId);
  174 +
  175 + /**
168 * 获得使用指定商机状态组的商机数量 176 * 获得使用指定商机状态组的商机数量
169 * 177 *
170 * @param statusTypeId 商机状态组编号 178 * @param statusTypeId 商机状态组编号
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
@@ -376,6 +376,11 @@ public class CrmBusinessServiceImpl implements CrmBusinessService { @@ -376,6 +376,11 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
376 } 376 }
377 377
378 @Override 378 @Override
  379 + public Long getBusinessProductCountByProductId(Long productId) {
  380 + return businessProductMapper.selectCount(CrmBusinessProductDO::getProductId, productId);
  381 + }
  382 +
  383 + @Override
379 public Long getBusinessCountByStatusTypeId(Long statusTypeId) { 384 public Long getBusinessCountByStatusTypeId(Long statusTypeId) {
380 return businessMapper.selectCountByStatusTypeId(statusTypeId); 385 return businessMapper.selectCountByStatusTypeId(statusTypeId);
381 } 386 }
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractService.java
@@ -178,6 +178,14 @@ public interface CrmContractService { @@ -178,6 +178,14 @@ public interface CrmContractService {
178 List<CrmContractProductDO> getContractProductListByContractId(Long contactId); 178 List<CrmContractProductDO> getContractProductListByContractId(Long contactId);
179 179
180 /** 180 /**
  181 + * 获得引用指定产品的合同产品数量
  182 + *
  183 + * @param productId 产品编号
  184 + * @return 数量
  185 + */
  186 + Long getContractProductCountByProductId(Long productId);
  187 +
  188 + /**
181 * 获得待审核合同数量 189 * 获得待审核合同数量
182 * 190 *
183 * @param userId 用户编号 191 * @param userId 用户编号
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -395,6 +395,11 @@ public class CrmContractServiceImpl implements CrmContractService { @@ -395,6 +395,11 @@ public class CrmContractServiceImpl implements CrmContractService {
395 } 395 }
396 396
397 @Override 397 @Override
  398 + public Long getContractProductCountByProductId(Long productId) {
  399 + return contractProductMapper.selectCount(CrmContractProductDO::getProductId, productId);
  400 + }
  401 +
  402 + @Override
398 public Long getAuditContractCount(Long userId) { 403 public Long getAuditContractCount(Long userId) {
399 return contractMapper.selectCountByAudit(userId); 404 return contractMapper.selectCountByAudit(userId);
400 } 405 }
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java
@@ -5,17 +5,15 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -5,17 +5,15 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductPageReqVO; 6 import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductPageReqVO;
7 import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductSaveReqVO; 7 import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductSaveReqVO;
8 -import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessProductDO;  
9 -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractProductDO;  
10 import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO; 8 import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO;
11 import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO; 9 import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;
12 -import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessProductMapper;  
13 -import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractProductMapper;  
14 import cn.iocoder.yudao.module.crm.dal.mysql.product.CrmProductMapper; 10 import cn.iocoder.yudao.module.crm.dal.mysql.product.CrmProductMapper;
15 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; 11 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
16 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; 12 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
17 import cn.iocoder.yudao.module.crm.enums.product.CrmProductStatusEnum; 13 import cn.iocoder.yudao.module.crm.enums.product.CrmProductStatusEnum;
18 import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission; 14 import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission;
  15 +import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
  16 +import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
19 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; 17 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
20 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; 18 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
21 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 19 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -23,6 +21,7 @@ import com.mzt.logapi.context.LogRecordContext; @@ -23,6 +21,7 @@ import com.mzt.logapi.context.LogRecordContext;
23 import com.mzt.logapi.service.impl.DiffParseFunction; 21 import com.mzt.logapi.service.impl.DiffParseFunction;
24 import com.mzt.logapi.starter.annotation.LogRecord; 22 import com.mzt.logapi.starter.annotation.LogRecord;
25 import jakarta.annotation.Resource; 23 import jakarta.annotation.Resource;
  24 +import org.springframework.context.annotation.Lazy;
26 import org.springframework.stereotype.Service; 25 import org.springframework.stereotype.Service;
27 import org.springframework.transaction.annotation.Transactional; 26 import org.springframework.transaction.annotation.Transactional;
28 import org.springframework.validation.annotation.Validated; 27 import org.springframework.validation.annotation.Validated;
@@ -53,9 +52,11 @@ public class CrmProductServiceImpl implements CrmProductService { @@ -53,9 +52,11 @@ public class CrmProductServiceImpl implements CrmProductService {
53 @Resource 52 @Resource
54 private CrmProductCategoryService productCategoryService; 53 private CrmProductCategoryService productCategoryService;
55 @Resource 54 @Resource
56 - private CrmContractProductMapper contractProductMapper; 55 + @Lazy // 延迟加载,避免循环依赖
  56 + private CrmContractService contractService;
57 @Resource 57 @Resource
58 - private CrmBusinessProductMapper businessProductMapper; 58 + @Lazy // 延迟加载,避免循环依赖
  59 + private CrmBusinessService businessService;
59 @Resource 60 @Resource
60 private CrmPermissionService permissionService; 61 private CrmPermissionService permissionService;
61 62
@@ -137,12 +138,13 @@ public class CrmProductServiceImpl implements CrmProductService { @@ -137,12 +138,13 @@ public class CrmProductServiceImpl implements CrmProductService {
137 // 校验存在 138 // 校验存在
138 validateProductExists(id); 139 validateProductExists(id);
139 // 校验未被合同/商机引用,避免删除后产生悬空引用 140 // 校验未被合同/商机引用,避免删除后产生悬空引用
140 - if (contractProductMapper.selectCount(CrmContractProductDO::getProductId, id) > 0) { 141 + if (contractService.getContractProductCountByProductId(id) > 0) {
141 throw exception(PRODUCT_DELETE_FAIL_CONTRACT_EXISTS); 142 throw exception(PRODUCT_DELETE_FAIL_CONTRACT_EXISTS);
142 } 143 }
143 - if (businessProductMapper.selectCount(CrmBusinessProductDO::getProductId, id) > 0) { 144 + if (businessService.getBusinessProductCountByProductId(id) > 0) {
144 throw exception(PRODUCT_DELETE_FAIL_BUSINESS_EXISTS); 145 throw exception(PRODUCT_DELETE_FAIL_BUSINESS_EXISTS);
145 } 146 }
  147 +
146 // 删除 148 // 删除
147 productMapper.deleteById(id); 149 productMapper.deleteById(id);
148 } 150 }
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java
@@ -11,20 +11,15 @@ import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductSa @@ -11,20 +11,15 @@ import cn.iocoder.yudao.module.erp.controller.admin.product.vo.product.ProductSa
11 import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductCategoryDO; 11 import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductCategoryDO;
12 import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; 12 import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
13 import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO; 13 import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductUnitDO;
14 -import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInItemDO;  
15 -import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO;  
16 -import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseReturnItemDO;  
17 -import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO;  
18 -import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOutItemDO;  
19 -import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleReturnItemDO;  
20 import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductMapper; 14 import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductMapper;
21 -import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseInItemMapper;  
22 -import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseOrderItemMapper;  
23 -import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseReturnItemMapper;  
24 -import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderItemMapper;  
25 -import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOutItemMapper;  
26 -import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleReturnItemMapper; 15 +import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInService;
  16 +import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseOrderService;
  17 +import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseReturnService;
  18 +import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOrderService;
  19 +import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOutService;
  20 +import cn.iocoder.yudao.module.erp.service.sale.ErpSaleReturnService;
27 import jakarta.annotation.Resource; 21 import jakarta.annotation.Resource;
  22 +import org.springframework.context.annotation.Lazy;
28 import org.springframework.stereotype.Service; 23 import org.springframework.stereotype.Service;
29 import org.springframework.validation.annotation.Validated; 24 import org.springframework.validation.annotation.Validated;
30 25
@@ -51,17 +46,23 @@ public class ErpProductServiceImpl implements ErpProductService { @@ -51,17 +46,23 @@ public class ErpProductServiceImpl implements ErpProductService {
51 @Resource 46 @Resource
52 private ErpProductUnitService productUnitService; 47 private ErpProductUnitService productUnitService;
53 @Resource 48 @Resource
54 - private ErpPurchaseOrderItemMapper purchaseOrderItemMapper; 49 + @Lazy // 延迟加载,避免循环依赖
  50 + private ErpPurchaseOrderService purchaseOrderService;
55 @Resource 51 @Resource
56 - private ErpPurchaseInItemMapper purchaseInItemMapper; 52 + @Lazy // 延迟加载,避免循环依赖
  53 + private ErpPurchaseInService purchaseInService;
57 @Resource 54 @Resource
58 - private ErpPurchaseReturnItemMapper purchaseReturnItemMapper; 55 + @Lazy // 延迟加载,避免循环依赖
  56 + private ErpPurchaseReturnService purchaseReturnService;
59 @Resource 57 @Resource
60 - private ErpSaleOrderItemMapper saleOrderItemMapper; 58 + @Lazy // 延迟加载,避免循环依赖
  59 + private ErpSaleOrderService saleOrderService;
61 @Resource 60 @Resource
62 - private ErpSaleOutItemMapper saleOutItemMapper; 61 + @Lazy // 延迟加载,避免循环依赖
  62 + private ErpSaleOutService saleOutService;
63 @Resource 63 @Resource
64 - private ErpSaleReturnItemMapper saleReturnItemMapper; 64 + @Lazy // 延迟加载,避免循环依赖
  65 + private ErpSaleReturnService saleReturnService;
65 66
66 @Override 67 @Override
67 public Long createProduct(ProductSaveReqVO createReqVO) { 68 public Long createProduct(ProductSaveReqVO createReqVO) {
@@ -88,22 +89,22 @@ public class ErpProductServiceImpl implements ErpProductService { @@ -88,22 +89,22 @@ public class ErpProductServiceImpl implements ErpProductService {
88 // 校验存在 89 // 校验存在
89 validateProductExists(id); 90 validateProductExists(id);
90 // 校验未被任何业务单据明细引用,避免删除后产生悬空引用 91 // 校验未被任何业务单据明细引用,避免删除后产生悬空引用
91 - if (purchaseOrderItemMapper.selectCount(ErpPurchaseOrderItemDO::getProductId, id) > 0) { 92 + if (purchaseOrderService.getPurchaseOrderItemCountByProductId(id) > 0) {
92 throw exception(PRODUCT_DELETE_FAIL_PURCHASE_ORDER_EXISTS); 93 throw exception(PRODUCT_DELETE_FAIL_PURCHASE_ORDER_EXISTS);
93 } 94 }
94 - if (purchaseInItemMapper.selectCount(ErpPurchaseInItemDO::getProductId, id) > 0) { 95 + if (purchaseInService.getPurchaseInItemCountByProductId(id) > 0) {
95 throw exception(PRODUCT_DELETE_FAIL_PURCHASE_IN_EXISTS); 96 throw exception(PRODUCT_DELETE_FAIL_PURCHASE_IN_EXISTS);
96 } 97 }
97 - if (purchaseReturnItemMapper.selectCount(ErpPurchaseReturnItemDO::getProductId, id) > 0) { 98 + if (purchaseReturnService.getPurchaseReturnItemCountByProductId(id) > 0) {
98 throw exception(PRODUCT_DELETE_FAIL_PURCHASE_RETURN_EXISTS); 99 throw exception(PRODUCT_DELETE_FAIL_PURCHASE_RETURN_EXISTS);
99 } 100 }
100 - if (saleOrderItemMapper.selectCount(ErpSaleOrderItemDO::getProductId, id) > 0) { 101 + if (saleOrderService.getSaleOrderItemCountByProductId(id) > 0) {
101 throw exception(PRODUCT_DELETE_FAIL_SALE_ORDER_EXISTS); 102 throw exception(PRODUCT_DELETE_FAIL_SALE_ORDER_EXISTS);
102 } 103 }
103 - if (saleOutItemMapper.selectCount(ErpSaleOutItemDO::getProductId, id) > 0) { 104 + if (saleOutService.getSaleOutItemCountByProductId(id) > 0) {
104 throw exception(PRODUCT_DELETE_FAIL_SALE_OUT_EXISTS); 105 throw exception(PRODUCT_DELETE_FAIL_SALE_OUT_EXISTS);
105 } 106 }
106 - if (saleReturnItemMapper.selectCount(ErpSaleReturnItemDO::getProductId, id) > 0) { 107 + if (saleReturnService.getSaleReturnItemCountByProductId(id) > 0) {
107 throw exception(PRODUCT_DELETE_FAIL_SALE_RETURN_EXISTS); 108 throw exception(PRODUCT_DELETE_FAIL_SALE_RETURN_EXISTS);
108 } 109 }
109 // 删除 110 // 删除
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInService.java
@@ -98,4 +98,12 @@ public interface ErpPurchaseInService { @@ -98,4 +98,12 @@ public interface ErpPurchaseInService {
98 */ 98 */
99 List<ErpPurchaseInItemDO> getPurchaseInItemListByInIds(Collection<Long> inIds); 99 List<ErpPurchaseInItemDO> getPurchaseInItemListByInIds(Collection<Long> inIds);
100 100
101 -}  
102 \ No newline at end of file 101 \ No newline at end of file
  102 + /**
  103 + * 获得引用指定产品的采购入库项数量
  104 + *
  105 + * @param productId 产品编号
  106 + * @return 数量
  107 + */
  108 + Long getPurchaseInItemCountByProductId(Long productId);
  109 +
  110 +}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInServiceImpl.java
@@ -323,4 +323,9 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { @@ -323,4 +323,9 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
323 return purchaseInItemMapper.selectListByInIds(inIds); 323 return purchaseInItemMapper.selectListByInIds(inIds);
324 } 324 }
325 325
  326 + @Override
  327 + public Long getPurchaseInItemCountByProductId(Long productId) {
  328 + return purchaseInItemMapper.selectCount(ErpPurchaseInItemDO::getProductId, productId);
  329 + }
  330 +
326 } 331 }
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderService.java
@@ -107,4 +107,12 @@ public interface ErpPurchaseOrderService { @@ -107,4 +107,12 @@ public interface ErpPurchaseOrderService {
107 */ 107 */
108 List<ErpPurchaseOrderItemDO> getPurchaseOrderItemListByOrderIds(Collection<Long> orderIds); 108 List<ErpPurchaseOrderItemDO> getPurchaseOrderItemListByOrderIds(Collection<Long> orderIds);
109 109
110 -}  
111 \ No newline at end of file 110 \ No newline at end of file
  111 + /**
  112 + * 获得引用指定产品的采购订单项数量
  113 + *
  114 + * @param productId 产品编号
  115 + * @return 数量
  116 + */
  117 + Long getPurchaseOrderItemCountByProductId(Long productId);
  118 +
  119 +}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
@@ -292,4 +292,9 @@ public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService { @@ -292,4 +292,9 @@ public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService {
292 return purchaseOrderItemMapper.selectListByOrderIds(orderIds); 292 return purchaseOrderItemMapper.selectListByOrderIds(orderIds);
293 } 293 }
294 294
  295 + @Override
  296 + public Long getPurchaseOrderItemCountByProductId(Long productId) {
  297 + return purchaseOrderItemMapper.selectCount(ErpPurchaseOrderItemDO::getProductId, productId);
  298 + }
  299 +
295 } 300 }
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseReturnService.java
@@ -98,4 +98,12 @@ public interface ErpPurchaseReturnService { @@ -98,4 +98,12 @@ public interface ErpPurchaseReturnService {
98 */ 98 */
99 List<ErpPurchaseReturnItemDO> getPurchaseReturnItemListByReturnIds(Collection<Long> returnIds); 99 List<ErpPurchaseReturnItemDO> getPurchaseReturnItemListByReturnIds(Collection<Long> returnIds);
100 100
101 -}  
102 \ No newline at end of file 101 \ No newline at end of file
  102 + /**
  103 + * 获得引用指定产品的采购退货项数量
  104 + *
  105 + * @param productId 产品编号
  106 + * @return 数量
  107 + */
  108 + Long getPurchaseReturnItemCountByProductId(Long productId);
  109 +
  110 +}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseReturnServiceImpl.java
@@ -301,4 +301,9 @@ public class ErpPurchaseReturnServiceImpl implements ErpPurchaseReturnService { @@ -301,4 +301,9 @@ public class ErpPurchaseReturnServiceImpl implements ErpPurchaseReturnService {
301 return purchaseReturnItemMapper.selectListByReturnIds(returnIds); 301 return purchaseReturnItemMapper.selectListByReturnIds(returnIds);
302 } 302 }
303 303
  304 + @Override
  305 + public Long getPurchaseReturnItemCountByProductId(Long productId) {
  306 + return purchaseReturnItemMapper.selectCount(ErpPurchaseReturnItemDO::getProductId, productId);
  307 + }
  308 +
304 } 309 }
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderService.java
@@ -107,4 +107,12 @@ public interface ErpSaleOrderService { @@ -107,4 +107,12 @@ public interface ErpSaleOrderService {
107 */ 107 */
108 List<ErpSaleOrderItemDO> getSaleOrderItemListByOrderIds(Collection<Long> orderIds); 108 List<ErpSaleOrderItemDO> getSaleOrderItemListByOrderIds(Collection<Long> orderIds);
109 109
110 -}  
111 \ No newline at end of file 110 \ No newline at end of file
  111 + /**
  112 + * 获得引用指定产品的销售订单项数量
  113 + *
  114 + * @param productId 产品编号
  115 + * @return 数量
  116 + */
  117 + Long getSaleOrderItemCountByProductId(Long productId);
  118 +
  119 +}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
@@ -304,4 +304,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { @@ -304,4 +304,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
304 return saleOrderItemMapper.selectListByOrderIds(orderIds); 304 return saleOrderItemMapper.selectListByOrderIds(orderIds);
305 } 305 }
306 306
  307 + @Override
  308 + public Long getSaleOrderItemCountByProductId(Long productId) {
  309 + return saleOrderItemMapper.selectCount(ErpSaleOrderItemDO::getProductId, productId);
  310 + }
  311 +
307 } 312 }
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOutService.java
@@ -99,4 +99,12 @@ public interface ErpSaleOutService { @@ -99,4 +99,12 @@ public interface ErpSaleOutService {
99 List<ErpSaleOutItemDO> getSaleOutItemListByOutIds(Collection<Long> outIds); 99 List<ErpSaleOutItemDO> getSaleOutItemListByOutIds(Collection<Long> outIds);
100 100
101 101
102 -}  
103 \ No newline at end of file 102 \ No newline at end of file
  103 + /**
  104 + * 获得引用指定产品的销售出库项数量
  105 + *
  106 + * @param productId 产品编号
  107 + * @return 数量
  108 + */
  109 + Long getSaleOutItemCountByProductId(Long productId);
  110 +
  111 +}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOutServiceImpl.java
@@ -313,4 +313,9 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService { @@ -313,4 +313,9 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
313 return saleOutItemMapper.selectListByOutIds(outIds); 313 return saleOutItemMapper.selectListByOutIds(outIds);
314 } 314 }
315 315
  316 + @Override
  317 + public Long getSaleOutItemCountByProductId(Long productId) {
  318 + return saleOutItemMapper.selectCount(ErpSaleOutItemDO::getProductId, productId);
  319 + }
  320 +
316 } 321 }
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleReturnService.java
@@ -98,4 +98,12 @@ public interface ErpSaleReturnService { @@ -98,4 +98,12 @@ public interface ErpSaleReturnService {
98 */ 98 */
99 List<ErpSaleReturnItemDO> getSaleReturnItemListByReturnIds(Collection<Long> returnIds); 99 List<ErpSaleReturnItemDO> getSaleReturnItemListByReturnIds(Collection<Long> returnIds);
100 100
101 -}  
102 \ No newline at end of file 101 \ No newline at end of file
  102 + /**
  103 + * 获得引用指定产品的销售退货项数量
  104 + *
  105 + * @param productId 产品编号
  106 + * @return 数量
  107 + */
  108 + Long getSaleReturnItemCountByProductId(Long productId);
  109 +
  110 +}
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleReturnServiceImpl.java
@@ -313,4 +313,9 @@ public class ErpSaleReturnServiceImpl implements ErpSaleReturnService { @@ -313,4 +313,9 @@ public class ErpSaleReturnServiceImpl implements ErpSaleReturnService {
313 return saleReturnItemMapper.selectListByReturnIds(returnIds); 313 return saleReturnItemMapper.selectListByReturnIds(returnIds);
314 } 314 }
315 315
  316 + @Override
  317 + public Long getSaleReturnItemCountByProductId(Long productId) {
  318 + return saleReturnItemMapper.selectCount(ErpSaleReturnItemDO::getProductId, productId);
  319 + }
  320 +
316 } 321 }