liyong
2026-05-15 76c84d95506998f546e6f3ebbf70414c0dd9da9d
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -10,7 +10,6 @@
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -23,12 +22,15 @@
import com.ruoyi.stock.dto.StockUninventoryDto;
import com.ruoyi.stock.execl.StockInventoryExportData;
import com.ruoyi.stock.mapper.StockInventoryMapper;
import com.ruoyi.stock.mapper.WarehouseInfoMapper;
import com.ruoyi.stock.pojo.StockInRecord;
import com.ruoyi.stock.pojo.StockInventory;
import com.ruoyi.stock.pojo.WarehouseInfo;
import com.ruoyi.stock.service.StockInRecordService;
import com.ruoyi.stock.service.StockInventoryService;
import com.ruoyi.stock.service.StockOutRecordService;
import com.ruoyi.stock.service.StockUninventoryService;
import com.ruoyi.warehouse.service.impl.WarehouseServiceImpl;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@@ -55,6 +57,8 @@
@AllArgsConstructor
public class StockInventoryServiceImpl extends ServiceImpl<StockInventoryMapper, StockInventory> implements StockInventoryService {
    private final WarehouseServiceImpl warehouseServiceImpl;
    private final WarehouseInfoMapper warehouseInfoMapper;
    private  StockInventoryMapper stockInventoryMapper;
    private StockInRecordService stockInRecordService;
    private StockOutRecordService stockOutRecordService;
@@ -74,16 +78,18 @@
    //入库调用
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean addstockInventory(StockInventoryDto stockInventoryDto) {
    public StockInRecordDto addstockInventory(StockInventoryDto stockInventoryDto) {
        Long warehouseInfoId = requireWarehouseInfoId(stockInventoryDto.getWarehouseInfoId());
        String batchNo = StringUtils.trim(stockInventoryDto.getBatchNo());
        if (StringUtils.isEmpty(batchNo)) {
            batchNo = generateAutoBatchNo(stockInventoryDto.getProductModelId());
        }
        stockInventoryDto.setBatchNo(batchNo);
        LambdaQueryWrapper<StockInventory> eq = new QueryWrapper<StockInventory>().lambda()
                .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId());
        eq.eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo());
        LambdaQueryWrapper<StockInventory> eq = buildQualifiedInventoryQuery(
                stockInventoryDto.getProductModelId(),
                stockInventoryDto.getBatchNo(),
                stockInventoryDto.getWarehouseInfoId()
        );
        //新增入库记录再添加库存
        StockInRecordDto stockInRecordDto = new StockInRecordDto();
        stockInRecordDto.setRecordId(stockInventoryDto.getRecordId());
@@ -92,6 +98,7 @@
        stockInRecordDto.setBatchNo(stockInventoryDto.getBatchNo());
        stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
        stockInRecordDto.setType("0");
        stockInRecordDto.setWarehouseInfoId(warehouseInfoId);
        stockInRecordService.add(stockInRecordDto);
        //再进行新增库存数量库存
        //先查询库存表中的产品是否存在,不存在新增,存在更新
@@ -104,35 +111,40 @@
            newStockInventory.setRemark(stockInventoryDto.getRemark());
            newStockInventory.setBatchNo(stockInventoryDto.getBatchNo());
            newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
            newStockInventory.setWarehouseInfoId(stockInventoryDto.getWarehouseInfoId());
            newStockInventory.setWarnNum(stockInventoryDto.getWarnNum());
            stockInventoryMapper.insert(newStockInventory);
        }else {
             stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
        }
        return true;
        return stockInRecordDto;
    }
    //出库调用
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean subtractStockInventory(StockInventoryDto stockInventoryDto) {
        LambdaQueryWrapper<StockInventory> eq = new QueryWrapper<StockInventory>().lambda()
            .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId());
    public StockOutRecordDto subtractStockInventory(StockInventoryDto stockInventoryDto) {
        Long warehouseInfoId = requireWarehouseInfoId(stockInventoryDto.getWarehouseInfoId());
        if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) {
            eq.isNull(StockInventory::getBatchNo);
            stockInventoryDto.setBatchNo(null);
        } else {
            eq.eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo());
        }
        LambdaQueryWrapper<StockInventory> eq = buildQualifiedInventoryQuery(
                stockInventoryDto.getProductModelId(),
                stockInventoryDto.getBatchNo(),
                stockInventoryDto.getWarehouseInfoId()
        );
        //  新增出库记录
        StockOutRecordDto stockOutRecordDto = new StockOutRecordDto();
        stockOutRecordDto.setRecordId(stockInventoryDto.getRecordId());
        stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType());
        stockOutRecordDto.setStockOutNum(stockInventoryDto.getQualitity());
        stockOutRecordDto.setBatchNo(stockInventoryDto.getBatchNo());
        stockOutRecordDto.setApprovalStatus(0);
        stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
        stockOutRecordDto.setType("0");
        stockOutRecordService.add(stockOutRecordDto);
        stockOutRecordDto.setWarehouseInfoId(warehouseInfoId);
        Long id = stockOutRecordService.add(stockOutRecordDto);
        stockInventoryDto.setId(id);
        StockInventory oldStockInventory = stockInventoryMapper.selectOne(eq);
@@ -148,12 +160,13 @@
        }
        stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto);
        return true;
        return stockOutRecordDto;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean addStockInRecordOnly(StockInventoryDto stockInventoryDto) {
    public StockInRecordDto addStockInRecordOnly(StockInventoryDto stockInventoryDto) {
        Long warehouseInfoId = requireWarehouseInfoId(stockInventoryDto.getWarehouseInfoId());
        String batchNo = StringUtils.trim(stockInventoryDto.getBatchNo());
        if (StringUtils.isEmpty(batchNo)) {
            batchNo = generateAutoBatchNo(stockInventoryDto.getProductModelId());
@@ -165,11 +178,14 @@
        stockInRecordDto.setRecordType(stockInventoryDto.getRecordType());
        stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity());
        stockInRecordDto.setBatchNo(batchNo);
        stockInRecordDto.setApprovalStatus(0);
        stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
        stockInRecordDto.setType("0");
        stockInRecordDto.setWarehouseInfoId(warehouseInfoId);
        stockInRecordDto.setRemark(stockInventoryDto.getRemark());
        stockInRecordService.add(stockInRecordDto);
        return true;
        Long add = stockInRecordService.add(stockInRecordDto);
        stockInRecordDto.setId( add);
        return stockInRecordDto;
    }
    //规则生成:20260424-产品编号-001
@@ -250,14 +266,16 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean addStockOutRecordOnly(StockInventoryDto stockInventoryDto) {
        LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>();
        eq.eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId());
    public StockOutRecordDto addStockOutRecordOnly(StockInventoryDto stockInventoryDto) {
        if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) {
            eq.isNull(StockInventory::getBatchNo);
        } else {
            eq.eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo());
            stockInventoryDto.setBatchNo(null);
        }
        Long warehouseInfoId = requireWarehouseInfoId(stockInventoryDto.getWarehouseInfoId());
        LambdaQueryWrapper<StockInventory> eq = buildQualifiedInventoryQuery(
                stockInventoryDto.getProductModelId(),
                stockInventoryDto.getBatchNo(),
                warehouseInfoId
        );
        StockInventory stockInventory = stockInventoryMapper.selectOne(eq);
        if (stockInventory == null) {
            throw new ServiceException("库存记录不存在");
@@ -269,6 +287,7 @@
        BigDecimal pendingOut = stockInventoryMapper.selectPendingOutQuantity(
                stockInventoryDto.getProductModelId(),
                stockInventoryDto.getBatchNo(),
                warehouseInfoId,
                "0"
        );
        if (pendingOut == null) {
@@ -285,9 +304,35 @@
        stockOutRecordDto.setBatchNo(stockInventoryDto.getBatchNo());
        stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
        stockOutRecordDto.setType("0");
        stockOutRecordDto.setWarehouseInfoId(warehouseInfoId);
        stockOutRecordDto.setRemark(stockInventoryDto.getRemark());
        stockOutRecordService.add(stockOutRecordDto);
        return true;
        Long add = stockOutRecordService.add(stockOutRecordDto);
        stockInventoryDto.setId(add);
        return stockOutRecordDto;
    }
    private Long requireWarehouseInfoId(Long warehouseInfoId) {
        if (warehouseInfoId == null) {
//            throw new ServiceException("仓库不能为空");
            warehouseInfoId = 1L;
        }
        return warehouseInfoId;
    }
    private LambdaQueryWrapper<StockInventory> buildQualifiedInventoryQuery(Long productModelId, String batchNo, Long warehouseInfoId) {
        LambdaQueryWrapper<StockInventory> wrapper = new QueryWrapper<StockInventory>().lambda()
                .eq(StockInventory::getProductModelId, productModelId);
        if (warehouseInfoId == null) {
            wrapper.isNull(StockInventory::getWarehouseInfoId);
        } else {
            wrapper.eq(StockInventory::getWarehouseInfoId, warehouseInfoId);
        }
        if (StringUtils.isEmpty(batchNo)) {
            wrapper.isNull(StockInventory::getBatchNo);
        } else {
            wrapper.eq(StockInventory::getBatchNo, batchNo);
        }
        return wrapper;
    }
    @Override
@@ -296,6 +341,7 @@
        try {
            // 查询所有的产品并构建映射,提高查找效率
            List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectProduct();
            List<WarehouseInfo> warehouseInfos = warehouseInfoMapper.selectList(null);
            Map<String, SalesLedgerProduct> productMap = new HashMap<>();
            for (SalesLedgerProduct product : salesLedgerProducts) {
                // 使用产品类别和规格型号作为键
@@ -325,6 +371,14 @@
                        stockInventoryDto.setQualitity(dto.getQualifiedQuantity());
                        stockInventoryDto.setRemark(dto.getRemark());
                        stockInventoryDto.setWarnNum(dto.getWarnNum());
                        stockInventoryDto.setBatchNo(dto.getBatchNo());
                        stockInventoryDto.setWarehouseName(dto.getWarehouseName());
                        Long warehouseInfoId = warehouseInfos.stream()
                                .filter(warehouseInfo -> dto.getWarehouseName().equals(warehouseInfo.getWarehouseName()))
                                .map(WarehouseInfo::getId)
                                .findFirst()
                                .orElseThrow(() -> new RuntimeException("系统未找到仓库:" + dto.getWarehouseName()));
                        stockInventoryDto.setWarehouseInfoId(warehouseInfoId);
                        // 验证合格冻结数量
                        if (ObjectUtils.isNotEmpty(dto.getQualifiedLockedQuantity())) {
@@ -345,9 +399,11 @@
                    if (dto.getUnQualifiedQuantity() != null && dto.getUnQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0) {
                        StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
                        stockUninventoryDto.setRecordId(0L);
                        stockUninventoryDto.setRecordType(StockInUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode());
                        stockUninventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode());
                        stockUninventoryDto.setQualitity(dto.getUnQualifiedQuantity());
                        stockUninventoryDto.setRemark(dto.getRemark());
                        stockUninventoryDto.setBatchNo(dto.getBatchNo());
                        stockUninventoryDto.setWarehouseName(dto.getWarehouseName());
                        // 验证不合格冻结数量
                        if (ObjectUtils.isNotEmpty(dto.getUnQualifiedLockedQuantity())) {
@@ -429,4 +485,24 @@
        stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity()));
        return this.updateById(stockInventory);
    }
    @Override
    public List<StockInventory> getByModelId(Long modelId) {
        return stockInventoryMapper.getByModelId(modelId);
    }
    @Override
    public List<StockInventoryDto> selectStockInvenrory(Long productModelId) {
        return stockInventoryMapper.selectStockInvenrory(productModelId);
    }
    @Override
    public IPage<StockInventoryDto> pagestockInventoryNoQua(Page page, StockInventoryDto stockInventoryDto) {
        return stockInventoryMapper.pagestockInventoryNoQua(page, stockInventoryDto);
    }
    @Override
    public boolean updateLocked(Long productModelId, String batchNo, boolean b) {
        return stockInventoryMapper.updateLocked(productModelId, batchNo, b) > 0;
    }
}