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<ProductMapper, Product> implements IProductService {
|
|
private ProductMapper productMapper;
|
|
private ProductModelMapper productModelMapper;
|
|
@Override
|
public List<ProductTreeDto> selectProductList(ProductDto productDto) {
|
// 一次性查询所有数据
|
LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
|
if (productDto.getProductName() != null && !productDto.getProductName().isEmpty()) {
|
queryWrapper.like(Product::getProductName, productDto.getProductName());
|
}
|
List<Product> allProducts = productMapper.selectList(queryWrapper);
|
|
// 在内存中构建树结构
|
return buildTree(allProducts);
|
}
|
|
/**
|
* 构建树结构
|
* @param allProducts 所有产品数据
|
* @return 树形结构列表
|
*/
|
private List<ProductTreeDto> buildTree(List<Product> allProducts) {
|
// 按 parentId 分组
|
java.util.Map<Long, List<Product>> parentMap = new java.util.HashMap<>();
|
List<Product> 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<ProductTreeDto> 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<Long, List<Product>> parentMap) {
|
ProductTreeDto node = convertToTreeDto(product);
|
List<Product> children = parentMap.get(product.getId());
|
if (children != null && !children.isEmpty()) {
|
List<ProductTreeDto> childNodes = new ArrayList<>();
|
for (Product child : children) {
|
childNodes.add(buildNode(child, parentMap));
|
}
|
node.setChildren(childNodes);
|
}
|
return node;
|
}
|
|
@Override
|
public IPage<ProductModel> listPageProductModel(Page<ProductModel> 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<ProductModel> queryWrapper = new LambdaQueryWrapper<>();
|
queryWrapper.in(ProductModel::getProductId, ids);
|
productModelMapper.delete(queryWrapper);
|
|
// 2. 删除主表 product 数据
|
int deleteCount = productMapper.deleteBatchIds(Arrays.asList(ids));
|
|
return deleteCount;
|
}
|
|
}
|