liyong
2026-05-15 76c84d95506998f546e6f3ebbf70414c0dd9da9d
src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.ProductDto;
@@ -11,21 +12,20 @@
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.basic.service.IProductService;
import com.ruoyi.basic.vo.ProductModelVo;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.stock.mapper.WarehouseInfoMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
@Service
@AllArgsConstructor
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IProductService {
    private final WarehouseInfoMapper warehouseInfoMapper;
    private ProductMapper productMapper;
    private ProductModelMapper productModelMapper;
@@ -39,6 +39,12 @@
        // 如果有产品名称条件,添加到查询中
        if (productDto.getProductName() != null && !productDto.getProductName().isEmpty()) {
            queryWrapper.like(Product::getProductName, productDto.getProductName());
        }
        // 浪潮用于区分成品和物料
        if (productDto.getProductType() != null && !productDto.getProductType().isEmpty()) {
            if (productDto.getProductType().equals("成品")) {
                queryWrapper.eq(Product::getProductName, productDto.getProductType());
            } else queryWrapper.ne(Product::getProductName, "成品");
        }
        // 查询根节点列表
@@ -55,10 +61,98 @@
    }
    @Override
    public IPage<ProductModel> listPageProductModel(Page<ProductModel> page, ProductModel productModel) {
    public IPage<ProductModelVo> listPageProductModel(Page<ProductModelVo> page, ProductModel productModel) {
        return productModelMapper.listPageProductModel(page, productModel);
    }
    @Override
    public IPage<ProductModelVo> pageModelAndQua(Page<ProductModelVo> page, ProductModel productModel) {
        IPage<ProductModelVo> result = productModelMapper.pageModelAndQua(page, productModel);
        fillBatchNoMaps(result.getRecords());
        return result;
    }
    private void fillBatchNoMaps(List<ProductModelVo> records) {
        if (records == null || records.isEmpty()) {
            return;
        }
        List<Long> productModelIds = records.stream()
                .map(ProductModelVo::getId)
                .filter(Objects::nonNull)
                .toList();
        if (productModelIds.isEmpty()) {
            return;
        }
        List<Map<String, Object>> batchRows = productModelMapper.selectBatchNoQtyByProductModelIds(productModelIds);
        List<Map<String, Object>> unqualifiedBatchRows =
                productModelMapper.selectUnqualifiedBatchNoQtyByProductModelIds(productModelIds);
        batchRows.addAll(unqualifiedBatchRows);
        Map<Long, HashMap<String, HashMap<String, BigDecimal>>> batchNoQtyMapsByProductModelId =
                buildBatchNoQtyMaps(batchRows);
        for (ProductModelVo record : records) {
            record.setBatchNoMaps(toBatchNoMaps(
                    batchNoQtyMapsByProductModelId.getOrDefault(record.getId(), new HashMap<>())));
        }
    }
    private Map<Long, HashMap<String, HashMap<String, BigDecimal>>> buildBatchNoQtyMaps(
            List<Map<String, Object>> batchRows) {
        Map<Long, HashMap<String, HashMap<String, BigDecimal>>> batchNoQtyMapsByProductModelId = new HashMap<>();
        for (Map<String, Object> batchRow : batchRows) {
            Long productModelId = toLong(batchRow.get("productModelId"));
            Long warehouseId = toLong(batchRow.get("warehouseId"));
            String batchNo = (String) batchRow.get("batchNo");
            if (productModelId == null || warehouseId == null || batchNo == null || batchNo.isBlank()) {
                continue;
            }
            batchNoQtyMapsByProductModelId
                    .computeIfAbsent(productModelId, key -> new HashMap<>())
                    .computeIfAbsent(String.valueOf(warehouseId), key -> new HashMap<>())
                    .merge(batchNo, toBigDecimal(batchRow.get("qty")), BigDecimal::add);
        }
        return batchNoQtyMapsByProductModelId;
    }
    private HashMap<String, List<Map<String, BigDecimal>>> toBatchNoMaps(
            HashMap<String, HashMap<String, BigDecimal>> stockBatchNoQtyMaps) {
        HashMap<String, List<Map<String, BigDecimal>>> batchNoMaps = new HashMap<>();
        for (Map.Entry<String, HashMap<String, BigDecimal>> entry : stockBatchNoQtyMaps.entrySet()) {
            List<Map<String, BigDecimal>> batchList = new ArrayList<>();
            for (Map.Entry<String, BigDecimal> batchEntry : entry.getValue().entrySet()) {
                Map<String, BigDecimal> batchItem = new HashMap<>();
                batchItem.put(batchEntry.getKey(), batchEntry.getValue());
                batchList.add(batchItem);
            }
            batchNoMaps.put(entry.getKey(), batchList);
        }
        return batchNoMaps;
    }
    private Long toLong(Object value) {
        if (value instanceof Number number) {
            return number.longValue();
        }
        if (value instanceof String str && !str.isBlank()) {
            return Long.parseLong(str);
        }
        return null;
    }
    private BigDecimal toBigDecimal(Object value) {
        if (value instanceof BigDecimal bigDecimal) {
            return bigDecimal;
        }
        if (value instanceof Number number) {
            return BigDecimal.valueOf(number.doubleValue());
        }
        if (value instanceof String str && !str.isBlank()) {
            return new BigDecimal(str);
        }
        return BigDecimal.ZERO;
    }
    // 递归构建子节点
    private List<ProductTreeDto> buildChildrenNodes(Long parentId) {
@@ -89,6 +183,9 @@
    @Override
    public int addOrEditProduct(ProductDto productDto) {
        if (ObjectUtils.isEmpty(productDto.getParentId())) {
            throw new IllegalArgumentException("请选择父节点");
        }
        if (productDto.getId() == null) {
            // 新增产品逻辑
            if (productDto.getParentId() == null) {