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