package cn.iocoder.yudao.module.erp.service.stock; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.erp.controller.admin.stock.vo.stock.ErpStockPageReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockDO; import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockMapper; import cn.iocoder.yudao.module.erp.service.product.ErpProductService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_COUNT_NEGATIVE; import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.STOCK_COUNT_NEGATIVE2; /** * ERP 产品库存 Service 实现类 * * @author 芋道源码 */ @Service @Validated public class ErpStockServiceImpl implements ErpStockService { /** * 允许库存为负数 * * TODO 芋艿:后续做成 db 配置 */ private static final Boolean NEGATIVE_STOCK_COUNT_ENABLE = false; @Resource private ErpProductService productService; @Resource private ErpWarehouseService warehouseService; @Resource private ErpStockMapper stockMapper; @Override public ErpStockDO getStock(Long id) { return stockMapper.selectById(id); } @Override public ErpStockDO getStock(Long productId, Long warehouseId) { return stockMapper.selectByProductIdAndWarehouseId(productId, warehouseId); } @Override public BigDecimal getStockCount(Long productId) { BigDecimal count = stockMapper.selectSumByProductId(productId); return count != null ? count : BigDecimal.ZERO; } @Override public PageResult getStockPage(ErpStockPageReqVO pageReqVO) { return stockMapper.selectPage(pageReqVO); } @Override public BigDecimal updateStockCountIncrement(Long productId, Long warehouseId, BigDecimal count) { // 1.1 查询当前库存 ErpStockDO stock = stockMapper.selectByProductIdAndWarehouseId(productId, warehouseId); if (stock == null) { stock = new ErpStockDO().setProductId(productId).setWarehouseId(warehouseId).setCount(BigDecimal.ZERO); stockMapper.insert(stock); } // 1.2 校验库存是否充足 if (!NEGATIVE_STOCK_COUNT_ENABLE && stock.getCount().add(count).compareTo(BigDecimal.ZERO) < 0) { throw exception(STOCK_COUNT_NEGATIVE, productService.getProduct(productId).getName(), warehouseService.getWarehouse(warehouseId).getName(), stock.getCount(), count); } // 2. 库存变更 int updateCount = stockMapper.updateCountIncrement(stock.getId(), count, NEGATIVE_STOCK_COUNT_ENABLE); if (updateCount == 0) { // 此时不好去查询最新库存,所以直接抛出该提示,不提供具体库存数字 throw exception(STOCK_COUNT_NEGATIVE2, productService.getProduct(productId).getName(), warehouseService.getWarehouse(warehouseId).getName()); } // 3. 返回最新库存 return stock.getCount().add(count); } }