package com.zbkj.service.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zbkj.common.exception.CarException; import com.zbkj.common.request.PageParamRequest; import com.zbkj.common.constants.CategoryConstants; import com.zbkj.common.constants.Constants; import com.zbkj.common.vo.CategoryTreeVo; import com.github.pagehelper.PageHelper; import com.zbkj.common.utils.CarUtil; import com.zbkj.common.model.category.Category; import com.zbkj.common.request.CategoryRequest; import com.zbkj.common.request.CategorySearchRequest; import com.zbkj.service.dao.CategoryDao; import com.zbkj.service.service.CategoryService; import com.zbkj.service.service.SystemAttachmentService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * CategoryServiceImpl 接口实现 */ @Service public class CategoryServiceImpl extends ServiceImpl implements CategoryService { @Resource private CategoryDao dao; @Autowired private SystemAttachmentService systemAttachmentService; /** * 获取分类下子类的数量 * @param request 请求参数 * @param pageParamRequest 分页参数 * @author Mr.Zhang * @since 2020-04-16 * @return List */ @Override public List getList(CategorySearchRequest request, PageParamRequest pageParamRequest) { PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); if(null != request.getPid()){ lambdaQueryWrapper.eq(Category::getPid, request.getPid()); } if(null != request.getType()){ lambdaQueryWrapper.eq(Category::getType, request.getType()); } if(ObjectUtil.isNotNull(request.getStatus()) && request.getStatus() >= 0){ lambdaQueryWrapper.eq(Category::getStatus, request.getStatus().equals(CategoryConstants.CATEGORY_STATUS_NORMAL)); } if(null != request.getName()){ lambdaQueryWrapper.like(Category::getName, request.getName()); } lambdaQueryWrapper.orderByDesc(Category::getSort).orderByDesc(Category::getId); return dao.selectList(lambdaQueryWrapper); } /** * 通过id集合获取列表 * @param idList List id集合 * @author Mr.Zhang * @since 2020-04-16 * @return List */ @Override public List getByIds(List idList) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.in(Category::getId, idList); return dao.selectList(lambdaQueryWrapper); } /** * 通过id集合获取列表 id => name * @param cateIdList List id集合 * @author Mr.Zhang * @since 2020-04-16 * @return HashMap */ @Override public HashMap getListInId(List cateIdList) { HashMap map = new HashMap<>(); List list = getByIds(cateIdList); for (Category category : list){ map.put(category.getId(), category.getName()); } return map; } /** * 查询id和url是否存在 * @author Mr.Zhang * @since 2020-04-16 * @return Boolean */ @Override public Boolean checkAuth(List pathIdList, String uri) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.in(Category::getId, pathIdList).eq(Category::getUrl, uri); List categoryList = dao.selectList(lambdaQueryWrapper); if(categoryList.size() < 1){ return false; } return true; } /** * 修改 * @param request CategoryRequest * @param id Integer * @author Mr.Zhang * @since 2020-04-16 * @return bool */ @Override public boolean update(CategoryRequest request, Integer id) { try{ //修改分类信息 Category category = new Category(); BeanUtils.copyProperties(request, category); category.setId(id); category.setPath(getPathByPId(category.getPid())); updateById(category); //如状态为关闭,那么所以子集的状态都关闭 if(!request.getStatus()){ updateStatusByPid(id, false); }else{ //如是开启,则父类的状态为开启 updatePidStatusById(id); } return true; }catch (Exception e){ e.printStackTrace(); return false; } } /** * 开启父级状态 * @param id Integer * @author Mr.Zhang * @since 2020-04-16 */ private void updatePidStatusById(Integer id) { Category category = getById(id); List categoryIdList = CarUtil.stringToArrayByRegex(category.getPath(), "/"); categoryIdList.removeIf(i -> i.equals(0)); ArrayList categoryArrayList = new ArrayList<>(); if(categoryIdList.size() < 1){ return; } for (Integer categoryId: categoryIdList) { Category categoryVo = new Category(); categoryVo.setId(categoryId); categoryVo.setStatus(true); categoryArrayList.add(categoryVo); } updateBatchById(categoryArrayList); } /** * 获取分类下子类的数量 * @param pid Integer * @author Mr.Zhang * @since 2020-04-16 * @return bool */ private int getChildCountByPid(Integer pid) { //查看是否有子类 QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.like("path", "/"+pid+"/"); return dao.selectCount(objectQueryWrapper); } /** * 修改分类以及子类的状态 * @param pid Integer * @author Mr.Zhang * @since 2020-04-16 * @return bool */ private int updateStatusByPid(Integer pid, boolean status) { //查看是否有子类 Category category = new Category(); category.setStatus(status); QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.like("path", "/"+pid+"/"); return dao.update(category, objectQueryWrapper); } private String getPathByPId(Integer pid) { Category category = getById(pid); if(null != category){ return category.getPath() + pid + "/"; } return null; } /** * 带结构的无线级分类 * @author Mr.Zhang * @since 2020-04-16 */ @Override public List getListTree(Integer type, Integer status, String name) { return getTree(type, status,name,null); } /** * 带权限的属性结构 */ @Override public List getListTree(Integer type, Integer status, List categoryIdList) { System.out.println("菜单列表:getListTree: type:" + type + "| status:" + status + "| categoryIdList:" + JSON.toJSONString(categoryIdList)); return getTree(type, status,null,categoryIdList); } /** * 带结构的无线级分类 * @author Mr.Zhang * @since 2020-04-16 */ private List getTree(Integer type, Integer status,String name, List categoryIdList) { //循环数据,把数据对象变成带list结构的vo List treeList = new ArrayList<>(); LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(Category::getType, type); if(null != categoryIdList && categoryIdList.size() > 0){ lambdaQueryWrapper.in(Category::getId, categoryIdList); } if(status >= 0){ lambdaQueryWrapper.eq(Category::getStatus, status); } if(StringUtils.isNotBlank(name)){ // 根据名称模糊搜索 lambdaQueryWrapper.like(Category::getName,name); } lambdaQueryWrapper.orderByDesc(Category::getSort); lambdaQueryWrapper.orderByAsc(Category::getId); List allTree = dao.selectList(lambdaQueryWrapper); if(allTree == null){ return null; } // 根据名称搜索特殊处理 这里仅仅处理两层搜索后有子父级关系的数据 if(StringUtils.isNotBlank(name) && allTree.size() >0){ List searchCategory = new ArrayList<>(); List categoryIds = allTree.stream().map(Category::getId).collect(Collectors.toList()); List pidList = allTree.stream().filter(c -> c.getPid() > 0 && !categoryIds.contains(c.getPid())) .map(Category::getPid).distinct().collect(Collectors.toList()); if (CollUtil.isNotEmpty(pidList)) { pidList.forEach(pid -> { searchCategory.add(dao.selectById(pid)); }); } allTree.addAll(searchCategory); } for (Category category: allTree) { CategoryTreeVo categoryTreeVo = new CategoryTreeVo(); BeanUtils.copyProperties(category, categoryTreeVo); treeList.add(categoryTreeVo); } //返回 Map map = new HashMap<>(); //ID 为 key 存储到map 中 for (CategoryTreeVo categoryTreeVo1 : treeList) { map.put(categoryTreeVo1.getId(), categoryTreeVo1); } List list = new ArrayList<>(); for (CategoryTreeVo tree : treeList) { //子集ID返回对象,有则添加。 CategoryTreeVo tree1 = map.get(tree.getPid()); if(tree1 != null){ tree1.getChild().add(tree); }else { list.add(tree); } } System.out.println("无限极分类 : getTree:" + JSON.toJSONString(list)); return list; } /** * 删除分类表 * @param id Integer * @author Mr.Zhang * @since 2020-04-16 * @return bool */ @Override public int delete(Integer id) { //查看是否有子类, 物理删除 if(getChildCountByPid(id) > 0){ throw new CarException("当前分类下有子类,请先删除子类!"); } return dao.deleteById(id); } /** * 获取分类下子类 * @param pid Integer * @author Mr.Zhang * @since 2020-04-16 * @return List */ @Override public List getChildVoListByPid(Integer pid) { //查看是否有子类 QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("status", CategoryConstants.CATEGORY_STATUS_NORMAL); objectQueryWrapper.like("path", "/"+pid+"/"); return dao.selectList(objectQueryWrapper); } /** * 检测分类名称是否存在 * @param name String 分类名 * @param type int 类型 * @author Mr.Zhang * @since 2020-04-16 * @return int */ private int checkName(String name, Integer type) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(Category::getName, name); if (ObjectUtil.isNotNull(type)) { lambdaQueryWrapper.eq(Category::getType, type); } return dao.selectCount(lambdaQueryWrapper); } /** * 检测url是否存在 * @param uri String url * @author Mr.Zhang * @since 2020-04-16 * @return int */ @Override public boolean checkUrl(String uri) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(Category::getUrl, uri); return dao.selectCount(lambdaQueryWrapper) > 0; } @Override public boolean updateStatus(Integer id) { Category category = getById(id); category.setStatus(!category.getStatus()); return updateById(category); } /** * 新增分类 * @param categoryRequest */ @Override public Boolean create(CategoryRequest categoryRequest) { //检测标题是否存在 if(checkName(categoryRequest.getName(), categoryRequest.getType()) > 0){ throw new CarException("此分类已存在"); } Category category = new Category(); BeanUtils.copyProperties(categoryRequest, category); category.setPath(getPathByPId(category.getPid())); category.setExtra(systemAttachmentService.clearPrefix(category.getExtra())); return save(category); } /** * 获取文章分类列表 * @return List */ @Override public List findArticleCategoryList() { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.select(Category::getId, Category::getName); lambdaQueryWrapper.eq(Category::getType, Constants.CATEGORY_TYPE_ARTICLE); lambdaQueryWrapper.eq(Category::getStatus, true); lambdaQueryWrapper.orderByDesc(Category::getSort); lambdaQueryWrapper.orderByAsc(Category::getId); return dao.selectList(lambdaQueryWrapper); } }