huminmin
13 小时以前 f16bf325804fb3bc6ab883693a96a374b3c63188
src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
@@ -13,6 +13,7 @@
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.stock.enums.StockInventorySourceEnum;
import com.ruoyi.stock.dto.StockInRecordDto;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.dto.StockOutRecordDto;
@@ -30,6 +31,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.time.LocalDate;
@@ -48,7 +50,7 @@
@RequiredArgsConstructor
public class StockUninventoryServiceImpl extends ServiceImpl<StockUninventoryMapper, StockUninventory> implements StockUninventoryService {
    private static final String UNQUALIFIED_TYPE = "unqualified";
    private final StockUninventoryMapper stockUninventoryMapper;
    private final StockOutRecordService stockOutRecordService;
    private final StockInRecordService stockInRecordService;
@@ -61,46 +63,71 @@
    }
    @Override
    public IPage<StockUninventoryDto> pageWasteQuery(Page page, StockUninventoryDto stockUninventoryDto) {
        IPage<StockUninventoryDto> resultPage = stockUninventoryMapper.pageWasteQuery(page, stockUninventoryDto);
        resultPage.getRecords().forEach(dto -> {
            if (StringUtils.isNotEmpty(dto.getSource())) {
                StockInventorySourceEnum sourceEnum = StockInventorySourceEnum.fromCode(dto.getSource());
                if (sourceEnum != null) {
                    dto.setSourceText(sourceEnum.getValue());
                }
            }
        });
        return resultPage;
    }
    @Override
    public IPage<StockUninventoryDto> getWasteBatchNoQty(Page page, StockInventoryDto stockInventoryDto) {
        IPage<StockUninventoryDto> resultPage = stockUninventoryMapper.getWasteBatchNoQty(page, stockInventoryDto);
        resultPage.getRecords().forEach(dto -> {
            if (StringUtils.isNotEmpty(dto.getSource())) {
                StockInventorySourceEnum unQualifiedSourceEnum = StockInventorySourceEnum.fromCode(dto.getSource());
                if (unQualifiedSourceEnum != null) {
                    dto.setSourceText(unQualifiedSourceEnum.getValue());
                }
            }
        });
        return resultPage;
    }
    @Override
    public List<StockUninventoryDto> getWasteByModelId(Long productModelId) {
        return stockUninventoryMapper.getWasteByModelId(productModelId);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Integer addStockUninventory(StockUninventoryDto stockUninventoryDto) {
        LambdaQueryWrapper<StockUninventory> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId());
        if (StringUtils.isEmpty(stockUninventoryDto.getBatchNo())) {
            stockUninventoryDto.setBatchNo(null);
            wrapper.isNull(StockUninventory::getBatchNo);
        } else {
            wrapper.eq(StockUninventory::getBatchNo, stockUninventoryDto.getBatchNo());
        }
        String inventoryType = resolveInventoryType(stockUninventoryDto);
        stockUninventoryDto.setType(inventoryType);
        String batchNo = resolveOrGenerateBatchNo(stockUninventoryDto.getBatchNo(), stockUninventoryDto.getProductModelId());
        stockUninventoryDto.setBatchNo(batchNo);
        //新增入库记录再添加库存
        StockInRecordDto stockInRecordDto = new StockInRecordDto();
        stockInRecordDto.setRecordId(stockUninventoryDto.getRecordId());
        stockInRecordDto.setRecordType(stockUninventoryDto.getRecordType());
        stockInRecordDto.setStockInNum(stockUninventoryDto.getQualitity());
        stockInRecordDto.setBatchNo(stockUninventoryDto.getBatchNo());
        stockInRecordDto.setBatchNo(batchNo);
        stockInRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
        stockInRecordDto.setType("1");
        stockInRecordService.add(stockInRecordDto);
        //再进行新增库存数量库存
        //先查询库存表中的产品是否存在,不存在新增,存在更新
        StockUninventory oldStockUnInventory = stockUninventoryMapper.selectOne(wrapper);
        if (ObjectUtils.isEmpty(oldStockUnInventory)) {
            StockUninventory newStockUnInventory = new StockUninventory();
            newStockUnInventory.setProductModelId(stockUninventoryDto.getProductModelId());
            newStockUnInventory.setQualitity(stockUninventoryDto.getQualitity());
            newStockUnInventory.setLockedQuantity(stockUninventoryDto.getLockedQuantity());
            newStockUnInventory.setBatchNo(stockUninventoryDto.getBatchNo());
            newStockUnInventory.setVersion(1);
            newStockUnInventory.setRemark(stockUninventoryDto.getRemark());
            stockUninventoryMapper.insert(newStockUnInventory);
        }else {
            stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto);
        if (UNQUALIFIED_TYPE.equals(inventoryType)) {
            stockInRecordDto.setType("1");
        } else {
            stockInRecordDto.setType("2");
        }
        stockInRecordDto.setManufacturerId(stockUninventoryDto.getManufacturerId());
        stockInRecordDto.setSource(stockUninventoryDto.getSource());
        stockInRecordService.add(stockInRecordDto);
        //审批再添加
        return 1;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Integer subtractStockUninventory(StockUninventoryDto stockUninventoryDto) {
        String inventoryType = resolveInventoryType(stockUninventoryDto);
        stockUninventoryDto.setType(inventoryType);
        String batchNo = resolveOutboundBatchNo(stockUninventoryDto.getProductModelId(), inventoryType, stockUninventoryDto.getBatchNo());
        stockUninventoryDto.setBatchNo(batchNo);
        //  新增出库记录
        StockOutRecordDto stockOutRecordDto = new StockOutRecordDto();
@@ -108,10 +135,18 @@
        stockOutRecordDto.setRecordType(stockUninventoryDto.getRecordType());
        stockOutRecordDto.setStockOutNum(stockUninventoryDto.getQualitity());
        stockOutRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
        stockOutRecordDto.setBatchNo(stockUninventoryDto.getBatchNo());
        stockOutRecordDto.setBatchNo(batchNo);
        stockOutRecordDto.setType("1");
        stockOutRecordService.add(stockOutRecordDto);
        StockUninventory oldStockInventory = stockUninventoryMapper.selectOne(new QueryWrapper<StockUninventory>().lambda().eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId()));
        LambdaQueryWrapper<StockUninventory> queryWrapper = new QueryWrapper<StockUninventory>().lambda()
                .eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId())
                .eq(StockUninventory::getType, inventoryType);
        if (StringUtils.isEmpty(batchNo)) {
            queryWrapper.isNull(StockUninventory::getBatchNo);
        } else {
            queryWrapper.eq(StockUninventory::getBatchNo, batchNo);
        }
        StockUninventory oldStockInventory = stockUninventoryMapper.selectOne(queryWrapper);
        if (ObjectUtils.isEmpty(oldStockInventory)) {
            throw new RuntimeException("产品库存不存在");
        }else {
@@ -123,18 +158,22 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Integer addStockInRecordOnly(StockUninventoryDto stockUninventoryDto) {
        String inventoryType = resolveInventoryType(stockUninventoryDto);
        stockUninventoryDto.setType(inventoryType);
        StockInRecordDto stockInRecordDto = new StockInRecordDto();
        stockInRecordDto.setRecordId(stockUninventoryDto.getRecordId());
        stockInRecordDto.setRecordType(stockUninventoryDto.getRecordType());
        stockInRecordDto.setStockInNum(stockUninventoryDto.getQualitity());
        String batchNo = StringUtils.trim(stockUninventoryDto.getBatchNo());
        if (StringUtils.isEmpty(batchNo)) {
            batchNo = generateAutoBatchNo(stockUninventoryDto.getProductModelId());
        }
        String batchNo = resolveOrGenerateBatchNo(stockUninventoryDto.getBatchNo(), stockUninventoryDto.getProductModelId());
        stockInRecordDto.setBatchNo(batchNo);
        stockInRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
        stockInRecordDto.setType("1");
        if (UNQUALIFIED_TYPE.equals(inventoryType)) {
            stockInRecordDto.setType("1");
        } else {
            stockInRecordDto.setType("2");
        }
        stockInRecordDto.setRemark(stockUninventoryDto.getRemark());
        stockInRecordDto.setSource(stockUninventoryDto.getSource());
        stockInRecordService.add(stockInRecordDto);
        return 1;
    }
@@ -142,12 +181,17 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Integer addStockOutRecordOnly(StockUninventoryDto stockUninventoryDto) {
        String inventoryType = resolveInventoryType(stockUninventoryDto);
        stockUninventoryDto.setType(inventoryType);
        String batchNo = resolveOutboundBatchNo(stockUninventoryDto.getProductModelId(), inventoryType, stockUninventoryDto.getBatchNo());
        stockUninventoryDto.setBatchNo(batchNo);
        LambdaQueryWrapper<StockUninventory> eq = new LambdaQueryWrapper<>();
        eq.eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId());
        if (StringUtils.isEmpty(stockUninventoryDto.getBatchNo())) {
        eq.eq(StockUninventory::getType, inventoryType);
        if (StringUtils.isEmpty(batchNo)) {
            eq.isNull(StockUninventory::getBatchNo);
        } else {
            eq.eq(StockUninventory::getBatchNo, stockUninventoryDto.getBatchNo());
            eq.eq(StockUninventory::getBatchNo, batchNo);
        }
        StockUninventory stockUninventory = stockUninventoryMapper.selectOne(eq);
        if (stockUninventory == null) {
@@ -173,7 +217,7 @@
        stockOutRecordDto.setRecordId(stockUninventoryDto.getRecordId());
        stockOutRecordDto.setRecordType(stockUninventoryDto.getRecordType());
        stockOutRecordDto.setStockOutNum(stockUninventoryDto.getQualitity());
        stockOutRecordDto.setBatchNo(stockUninventoryDto.getBatchNo());
        stockOutRecordDto.setBatchNo(batchNo);
        stockOutRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
        stockOutRecordDto.setType("1");
        stockOutRecordDto.setRemark(stockUninventoryDto.getRemark());
@@ -184,8 +228,31 @@
    @Override
    public void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto) {
        List<StockUnInventoryExportData> list = stockUninventoryMapper.listStockInventoryExportData(stockUninventoryDto);
        list.forEach(item -> {
            if (StringUtils.isNotEmpty(item.getSource())) {
                StockInventorySourceEnum sourceEnum = StockInventorySourceEnum.fromCode(item.getSource());
                if (sourceEnum != null) {
                    item.setSourceText(sourceEnum.getValue());
                }
            }
        });
        ExcelUtil<StockUnInventoryExportData> util = new ExcelUtil<>(StockUnInventoryExportData.class);
        util.exportExcel(response,list, "不合格库存信息");
    }
    @Override
    public void exportWasteQuery(HttpServletResponse response, StockUninventoryDto stockUninventoryDto) {
        List<StockUnInventoryExportData> list = stockUninventoryMapper.listWasteQueryExportData(stockUninventoryDto);
        list.forEach(item -> {
            if (StringUtils.isNotEmpty(item.getSource())) {
                StockInventorySourceEnum sourceEnum = StockInventorySourceEnum.fromCode(item.getSource());
                if (sourceEnum != null) {
                    item.setSourceText(sourceEnum.getValue());
                }
            }
        });
        ExcelUtil<StockUnInventoryExportData> util = new ExcelUtil<>(StockUnInventoryExportData.class);
        util.exportExcel(response, list, "废品查询信息");
    }
    @Override
@@ -210,6 +277,13 @@
        }
        stockUninventory.setLockedQuantity(stockUninventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity()));
        return this.updateById(stockUninventory);
    }
    private String resolveInventoryType(StockUninventoryDto stockUninventoryDto) {
        if (stockUninventoryDto != null && StringUtils.isNotEmpty(stockUninventoryDto.getType())) {
            return stockUninventoryDto.getType().trim();
        }
        return UNQUALIFIED_TYPE;
    }
    //规则生成:20260424-产品编号-001
@@ -260,6 +334,33 @@
        return maxSequence;
    }
    private String resolveOrGenerateBatchNo(String batchNo, Long productModelId) {
        String normalizedBatchNo = StringUtils.trim(batchNo);
        if (StringUtils.isNotEmpty(normalizedBatchNo)) {
            return normalizedBatchNo;
        }
        return generateAutoBatchNo(productModelId);
    }
    private String resolveOutboundBatchNo(Long productModelId, String inventoryType, String batchNo) {
        String normalizedBatchNo = StringUtils.trim(batchNo);
        if (StringUtils.isNotEmpty(normalizedBatchNo)) {
            return normalizedBatchNo;
        }
        List<StockUninventory> stockUninventoryList = stockUninventoryMapper.selectList(
                Wrappers.<StockUninventory>lambdaQuery()
                        .eq(StockUninventory::getProductModelId, productModelId)
                        .eq(StockUninventory::getType, inventoryType)
                        .orderByDesc(StockUninventory::getId));
        if (CollectionUtils.isEmpty(stockUninventoryList)) {
            throw new BaseException("库存记录不存在");
        }
        if (stockUninventoryList.size() == 1) {
            return stockUninventoryList.get(0).getBatchNo();
        }
        throw new BaseException("当前产品规格存在多个批次,请先选择批号后再出库");
    }
    private int parseSequence(String batchNo, String prefix) {
        if (StringUtils.isEmpty(batchNo) || StringUtils.isEmpty(prefix) || !batchNo.startsWith(prefix)) {
            return 0;