package com.ruoyi.basic.service.impl; 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; import com.ruoyi.basic.dto.ProductTreeDto; import com.ruoyi.basic.mapper.ProductMapper; import com.ruoyi.basic.mapper.ProductModelMapper; 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.stock.mapper.WarehouseInfoMapper; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; @Service @AllArgsConstructor public class ProductServiceImpl extends ServiceImpl implements IProductService { private final WarehouseInfoMapper warehouseInfoMapper; private ProductMapper productMapper; private ProductModelMapper productModelMapper; @Override public List selectProductList(ProductDto productDto) { // 查询根节点(parentId 为 null) LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.isNull(Product::getParentId); // 如果有产品名称条件,添加到查询中 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, "成品"); } // 查询根节点列表 List rootProducts = productMapper.selectList(queryWrapper); // 转换为树节点并递归构建子树 List tree = new ArrayList<>(); for (Product product : rootProducts) { ProductTreeDto node = convertToTreeDto(product); node.setChildren(buildChildrenNodes(product.getId())); tree.add(node); } return tree; } @Override public IPage listPageProductModel(Page page, ProductModel productModel) { return productModelMapper.listPageProductModel(page, productModel); } @Override public IPage pageModelAndQua(Page page, ProductModel productModel) { IPage result = productModelMapper.pageModelAndQua(page, productModel); fillBatchNoMaps(result.getRecords()); return result; } private void fillBatchNoMaps(List records) { if (records == null || records.isEmpty()) { return; } List productModelIds = records.stream() .map(ProductModelVo::getId) .filter(Objects::nonNull) .toList(); if (productModelIds.isEmpty()) { return; } List> batchRows = productModelMapper.selectBatchNoQtyByProductModelIds(productModelIds); List> unqualifiedBatchRows = productModelMapper.selectUnqualifiedBatchNoQtyByProductModelIds(productModelIds); batchRows.addAll(unqualifiedBatchRows); Map>> batchNoQtyMapsByProductModelId = buildBatchNoQtyMaps(batchRows); for (ProductModelVo record : records) { record.setBatchNoMaps(toBatchNoMaps( batchNoQtyMapsByProductModelId.getOrDefault(record.getId(), new HashMap<>()))); } } private Map>> buildBatchNoQtyMaps( List> batchRows) { Map>> batchNoQtyMapsByProductModelId = new HashMap<>(); for (Map 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>> toBatchNoMaps( HashMap> stockBatchNoQtyMaps) { HashMap>> batchNoMaps = new HashMap<>(); for (Map.Entry> entry : stockBatchNoQtyMaps.entrySet()) { List> batchList = new ArrayList<>(); for (Map.Entry batchEntry : entry.getValue().entrySet()) { Map 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 buildChildrenNodes(Long parentId) { // 查询当前父节点的子节点 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Product::getParentId, parentId); List childProducts = productMapper.selectList(queryWrapper); // 转换子节点并递归构建它们的子树 List children = new ArrayList<>(); for (Product child : childProducts) { ProductTreeDto childNode = convertToTreeDto(child); childNode.setChildren(buildChildrenNodes(child.getId())); children.add(childNode); } return children; } // 将 Product 转换为 ProductTreeDto private ProductTreeDto convertToTreeDto(Product product) { ProductTreeDto dto = new ProductTreeDto(); BeanUtils.copyProperties(product, dto); dto.setLabel(product.getProductName()); // 设置 label 为产品名称 dto.setChildren(new ArrayList<>()); return dto; } @Override public int addOrEditProduct(ProductDto productDto) { if (ObjectUtils.isEmpty(productDto.getParentId())) { throw new IllegalArgumentException("请选择父节点"); } if (productDto.getId() == null) { // 新增产品逻辑 if (productDto.getParentId() == null) { // 若未指定父节点,默认为根节点(parentId 设为 null) productDto.setParentId(null); } else { // 检查父节点是否存在(可选,根据业务需求) Product parent = productMapper.selectById(productDto.getParentId()); if (parent == null) { throw new IllegalArgumentException("父节点不存在,无法添加子产品"); } } return productMapper.insert(productDto); } else { // 编辑产品逻辑 // 检查产品是否存在(可选,根据业务需求) Product existingProduct = productMapper.selectById(productDto.getId()); if (existingProduct == null) { throw new IllegalArgumentException("要编辑的产品不存在"); } return productMapper.updateById(productDto); } } @Override public int delProductByIds(Long[] ids) { // 1. 删除子表 product_model 中关联的数据 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(ProductModel::getProductId, ids); productModelMapper.delete(queryWrapper); // 2. 删除主表 product 数据 int deleteCount = productMapper.deleteBatchIds(Arrays.asList(ids)); return deleteCount; } }