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.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.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.domain.AjaxResult; 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; @Service @AllArgsConstructor public class ProductServiceImpl extends ServiceImpl implements IProductService { private ProductMapper productMapper; private ProductModelMapper productModelMapper; @Override public List selectProductList(ProductDto productDto) { // 一次性查询所有数据 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); if (productDto.getProductName() != null && !productDto.getProductName().isEmpty()) { queryWrapper.like(Product::getProductName, productDto.getProductName()); } List allProducts = productMapper.selectList(queryWrapper); // 在内存中构建树结构 return buildTree(allProducts); } /** * 构建树结构 * @param allProducts 所有产品数据 * @return 树形结构列表 */ private List buildTree(List allProducts) { // 按 parentId 分组 java.util.Map> parentMap = new java.util.HashMap<>(); List rootList = new ArrayList<>(); for (Product product : allProducts) { if (product.getParentId() == null) { rootList.add(product); } else { parentMap.computeIfAbsent(product.getParentId(), k -> new ArrayList<>()).add(product); } } // 递归构建子节点 List tree = new ArrayList<>(); for (Product root : rootList) { tree.add(buildNode(root, parentMap)); } return tree; } /** * 递归构建节点及其子节点 * @param product 产品实体 * @param parentMap 按parentId分组的map * @return 树节点 */ private ProductTreeDto buildNode(Product product, java.util.Map> parentMap) { ProductTreeDto node = convertToTreeDto(product); List children = parentMap.get(product.getId()); if (children != null && !children.isEmpty()) { List childNodes = new ArrayList<>(); for (Product child : children) { childNodes.add(buildNode(child, parentMap)); } node.setChildren(childNodes); } return node; } @Override public IPage listPageProductModel(Page page, ProductModel productModel) { return productModelMapper.listPageProductModel(page, productModel); } // 将 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 (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; } }