package com.ruoyi.basic.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.dto.CustomerRegionsTreeDto; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.mapper.CustomerRegionsMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.basic.pojo.CustomerRegions; import com.ruoyi.basic.service.ICustomerRegionsService; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** *

* 客户地区表 服务实现类 *

* * @author deslrey * @since 2026-03-27 */ @Service public class CustomerRegionsServiceImpl extends ServiceImpl implements ICustomerRegionsService { @Autowired private CustomerMapper customerMapper; /** * 查询树形地区列表 */ @Override public List customerRegionsList(CustomerRegions customerRegions) { List allRegions = baseMapper.selectList(null); if (allRegions == null || allRegions.isEmpty()) { return new ArrayList<>(); } Map nodeMap = new HashMap<>(); List allDtoList = new ArrayList<>(); for (CustomerRegions region : allRegions) { CustomerRegionsTreeDto dto = new CustomerRegionsTreeDto(); dto.setId(region.getId()); dto.setParentId(region.getParentId()); dto.setRegionsName(region.getRegionsName()); dto.setLabel(region.getRegionsName()); // 统一 label 字段 dto.setChildren(new ArrayList<>()); nodeMap.put(dto.getId(), dto); allDtoList.add(dto); } List treeList = new ArrayList<>(); for (CustomerRegionsTreeDto node : allDtoList) { Long parentId = node.getParentId(); // 如果是根节点 (parentId 为 0 或 null) 或 找不到父节点,则作为顶级节点 if (parentId == null || parentId == 0 || !nodeMap.containsKey(parentId)) { treeList.add(node); } else { // 否则将其添加到父节点的 children 中 nodeMap.get(parentId).getChildren().add(node); } } String keyword = customerRegions != null ? customerRegions.getRegionsName() : null; if (StringUtils.isNotEmpty(keyword)) { return filterTree(treeList, keyword); } return treeList; } /** * 递归过滤树节点 */ private List filterTree(List list, String keyword) { List filteredList = new ArrayList<>(); for (CustomerRegionsTreeDto node : list) { // 递归处理子节点 List filteredChildren = filterTree(node.getChildren(), keyword); node.setChildren(filteredChildren); // 如果当前节点名称包含关键字,或者子节点过滤后不为空,则保留该节点 if (node.getRegionsName().contains(keyword) || !filteredChildren.isEmpty()) { filteredList.add(node); } } return filteredList; } /** * 添加地区 */ @Override @Transactional(rollbackFor = Exception.class) public void addCustomerRegions(CustomerRegions customerRegions) { validateRegion(customerRegions); checkUnique(customerRegions); if (baseMapper.insert(customerRegions) <= 0) { throw new ServiceException("添加失败"); } } /** * 修改地区 */ @Override @Transactional(rollbackFor = Exception.class) public void updateCustomerRegions(CustomerRegions customerRegions) { if (customerRegions.getId() == null) { throw new ServiceException("修改失败, ID不能为空"); } validateRegion(customerRegions); if (customerRegions.getId().equals(customerRegions.getParentId())) { throw new ServiceException("修改失败, 上级地区不能是自己"); } checkUnique(customerRegions); if (baseMapper.updateById(customerRegions) <= 0) { throw new ServiceException("修改失败"); } } /** * 删除地区 */ @Override @Transactional(rollbackFor = Exception.class) public void delCustomerRegions(Long id) { if (id == null) { throw new ServiceException("删除失败, ID不能为空"); } boolean hasChildren = baseMapper.selectCount(new LambdaQueryWrapper() .eq(CustomerRegions::getParentId, id)) > 0; if (hasChildren) { throw new ServiceException("删除失败, 该地区下存在子地区"); } boolean isUsedByCustomer = customerMapper.selectCount(new LambdaQueryWrapper() .eq(Customer::getRegionsId, id)) > 0; if (isUsedByCustomer) { throw new ServiceException("删除失败, 该地区已被客户档案引用"); } if (baseMapper.deleteById(id) <= 0) { throw new ServiceException("删除失败, 数据不存在"); } } /** * 查询当前地区及其所有子集的 ID 集合 */ @Override public List regionsChildrenIds(Long regionsId) { List childIds = new ArrayList<>(); if (regionsId == null) { return childIds; } List allRegions = baseMapper.selectList(null); if (allRegions == null || allRegions.isEmpty()) { return childIds; } childIds.add(regionsId); findAllChildren(allRegions, regionsId, childIds); return childIds; } /** * 递归地区方法 * * @param allRegions 所有地区列表 * @param parentId 当前父级 ID * @param result 存放结果的集合 */ private void findAllChildren(List allRegions, Long parentId, List result) { for (CustomerRegions region : allRegions) { // 判断 parentId 是否匹配 if (parentId.equals(region.getParentId())) { result.add(region.getId()); // 继续递归查找该节点的子节点 findAllChildren(allRegions, region.getId(), result); } } } private void validateRegion(CustomerRegions region) { if (region == null) { throw new ServiceException("操作失败, 数据不能为空"); } if (StringUtils.isEmpty(region.getRegionsName())) { throw new ServiceException("操作失败, 地区名称不能为空"); } if (region.getParentId() == null) { region.setParentId(0L); } } private void checkUnique(CustomerRegions region) { CustomerRegions existing = baseMapper.selectOne(new LambdaQueryWrapper() .eq(CustomerRegions::getRegionsName, region.getRegionsName()) .eq(CustomerRegions::getParentId, region.getParentId()) .ne(region.getId() != null, CustomerRegions::getId, region.getId())); if (existing != null) { throw new ServiceException("该层级下已存在名为 [" + region.getRegionsName() + "] 的地区"); } } }