package cn.lili.modules.goods.serviceimpl; import cn.hutool.core.text.CharSequenceUtil; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.common.enums.ResultCode; import cn.lili.common.event.TransactionCommitSendMQEvent; import cn.lili.common.exception.ServiceException; import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.modules.goods.entity.dos.Category; import cn.lili.modules.goods.entity.dto.CategorySearchParams; import cn.lili.modules.goods.entity.vos.CategoryVO; import cn.lili.modules.goods.mapper.CategoryMapper; import cn.lili.modules.goods.service.CategoryBrandService; import cn.lili.modules.goods.service.CategoryParameterGroupService; import cn.lili.modules.goods.service.CategoryService; import cn.lili.modules.goods.service.CategorySpecificationService; import cn.lili.rocketmq.tags.GoodsTagsEnum; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; /** * 商品分类业务层实现 * * @author pikachu * @since 2020-02-23 15:18:56 */ @Service @CacheConfig(cacheNames = "{CATEGORY}") public class CategoryServiceImpl extends ServiceImpl implements CategoryService { private static final String DELETE_FLAG_COLUMN = "delete_flag"; /** * 缓存 */ @Autowired private Cache cache; @Autowired private CategoryBrandService categoryBrandService; @Autowired private CategoryParameterGroupService categoryParameterGroupService; @Autowired private CategorySpecificationService categorySpecificationService; @Autowired private ApplicationEventPublisher applicationEventPublisher; /** * rocketMq */ @Autowired private RocketMQTemplate rocketMQTemplate; /** * rocketMq配置 */ @Autowired private RocketmqCustomProperties rocketmqCustomProperties; @Override public List dbList(String parentId) { return this.list(new LambdaQueryWrapper().eq(Category::getParentId, parentId)); } @Override @Cacheable(key = "#id") public Category getCategoryById(String id) { return this.getById(id); } /** * 根据分类id集合获取所有分类根据层级排序 * * @param ids 分类ID集合 * @return 商品分类列表 */ @Override public List listByIdsOrderByLevel(List ids) { return this.list(new LambdaQueryWrapper().in(Category::getId, ids).orderByAsc(Category::getLevel)); } @Override public List> listMapsByIdsOrderByLevel(List ids, String columns) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.select(columns); queryWrapper.in("id", ids).orderByAsc("level"); return this.listMaps(queryWrapper); } @Override public List categoryTree() { List categoryVOList = (List) cache.get(CachePrefix.CATEGORY.getPrefix()); if (categoryVOList != null) { return categoryVOList; } //获取全部分类 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Category::getDeleteFlag, false); List list = this.list(queryWrapper); //构造分类树 categoryVOList = new ArrayList<>(); for (Category category : list) { if ("0".equals(category.getParentId())) { CategoryVO categoryVO = new CategoryVO(category); categoryVO.setChildren(findChildren(list, categoryVO)); categoryVOList.add(categoryVO); } } categoryVOList.sort(Comparator.comparing(Category::getSortOrder)); if (!categoryVOList.isEmpty()) { cache.put(CachePrefix.CATEGORY.getPrefix(), categoryVOList); cache.put(CachePrefix.CATEGORY_ARRAY.getPrefix(), list); } return categoryVOList; } @Override public List getStoreCategory(String[] categories) { List arr = Arrays.asList(categories.clone()); return categoryTree().stream() .filter(item -> arr.contains(item.getId())).collect(Collectors.toList()); } @Override public List firstCategory() { QueryWrapper queryWrapper = Wrappers.query(); queryWrapper.eq("level", 0); return list(queryWrapper); } @Override public List listAllChildren(String parentId) { if ("0".equals(parentId)) { return categoryTree(); } //循环代码,找到对象,把他的子分类返回 List topCatList = categoryTree(); for (CategoryVO item : topCatList) { if (item.getId().equals(parentId)) { return item.getChildren(); } else { return getChildren(parentId, item.getChildren()); } } return new ArrayList<>(); } @Override public List listAllChildren(CategorySearchParams categorySearchParams) { //获取全部分类 List list = this.list(categorySearchParams.queryWrapper()); //构造分类树 List categoryVOList = new ArrayList<>(); for (Category category : list) { if (("0").equals(category.getParentId())) { CategoryVO categoryVO = new CategoryVO(category); categoryVO.setChildren(findChildren(list, categoryVO)); categoryVOList.add(categoryVO); } } categoryVOList.sort(Comparator.comparing(Category::getSortOrder)); return categoryVOList; } /** * 获取指定分类的分类名称 * * @param ids 指定分类id集合 * @return 分类名称集合 */ @Override public List getCategoryNameByIds(List ids) { List categoryName = new ArrayList<>(); List categoryVOList = (List) cache.get(CachePrefix.CATEGORY_ARRAY.getPrefix()); //如果缓存中为空,则重新获取缓存 if (categoryVOList == null) { categoryTree(); categoryVOList = (List) cache.get(CachePrefix.CATEGORY_ARRAY.getPrefix()); } //还为空的话,直接返回 if (categoryVOList == null) { return new ArrayList<>(); } //循环顶级分类 for (Category category : categoryVOList) { //循环查询的id匹配 for (String id : ids) { if (category.getId().equals(id)) { //写入商品分类 categoryName.add(category.getName()); } } } return categoryName; } @Override public List findByAllBySortOrder(Category category) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq(category.getLevel() != null, "level", category.getLevel()) .eq(CharSequenceUtil.isNotBlank(category.getName()), "name", category.getName()) .eq(category.getParentId() != null, "parent_id", category.getParentId()) .ne(category.getId() != null, "id", category.getId()) .eq(DELETE_FLAG_COLUMN, false) .orderByAsc("sort_order"); return this.baseMapper.selectList(queryWrapper); } @Override @Transactional(rollbackFor = Exception.class) public boolean saveCategory(Category category) { //判断分类佣金是否正确 if (category.getCommissionRate() < 0) { throw new ServiceException(ResultCode.CATEGORY_COMMISSION_RATE_ERROR); } //子分类与父分类的状态一致 if (category.getParentId() != null && !("0").equals(category.getParentId())) { Category parentCategory = this.getById(category.getParentId()); category.setDeleteFlag(parentCategory.getDeleteFlag()); } this.save(category); removeCache(); return true; } @Override @CacheEvict(key = "#category.id") @Transactional(rollbackFor = Exception.class) public void updateCategory(Category category) { //判断分类佣金是否正确 if (category.getCommissionRate() < 0) { throw new ServiceException(ResultCode.CATEGORY_COMMISSION_RATE_ERROR); } //判断父分类与子分类的状态是否一致 if (category.getParentId() != null && !"0".equals(category.getParentId())) { Category parentCategory = this.getById(category.getParentId()); if (!parentCategory.getDeleteFlag().equals(category.getDeleteFlag())) { throw new ServiceException(ResultCode.CATEGORY_DELETE_FLAG_ERROR); } } UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", category.getId()); this.baseMapper.update(category, updateWrapper); removeCache(); applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("同步商品分类名称", rocketmqCustomProperties.getGoodsTopic(), GoodsTagsEnum.CATEGORY_GOODS_NAME.name(), category.getId())); } @Override @CacheEvict(key = "#id") @Transactional(rollbackFor = Exception.class) public void delete(String id) { this.removeById(id); removeCache(); //删除关联关系 categoryBrandService.deleteByCategoryId(id); categoryParameterGroupService.deleteByCategoryId(id); categorySpecificationService.deleteByCategoryId(id); } @Override @CacheEvict(key = "#categoryId") @Transactional(rollbackFor = Exception.class) public void updateCategoryStatus(String categoryId, Boolean enableOperations) { //禁用子分类 CategoryVO categoryVO = new CategoryVO(this.getById(categoryId)); List ids = new ArrayList<>(); ids.add(categoryVO.getId()); this.findAllChild(categoryVO); this.findAllChildIds(categoryVO, ids); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.in(Category::getId, ids); updateWrapper.set(Category::getDeleteFlag, enableOperations); this.update(updateWrapper); removeCache(); } /** * 递归树形VO * * @param categories 分类列表 * @param categoryVO 分类VO * @return 分类VO列表 */ private List findChildren(List categories, CategoryVO categoryVO) { List children = new ArrayList<>(); categories.forEach(item -> { if (item.getParentId().equals(categoryVO.getId())) { CategoryVO temp = new CategoryVO(item); temp.setChildren(findChildren(categories, temp)); children.add(temp); } }); return children; } /** * 条件查询分类 * * @param category 分类VO */ private void findAllChild(CategoryVO category) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Category::getParentId, category.getId()); List categories = this.list(queryWrapper); List categoryVOList = new ArrayList<>(); for (Category category1 : categories) { categoryVOList.add(new CategoryVO(category1)); } category.setChildren(categoryVOList); if (!categoryVOList.isEmpty()) { categoryVOList.forEach(this::findAllChild); } } /** * 获取所有的子分类ID * * @param category 分类 * @param ids ID列表 */ private void findAllChildIds(CategoryVO category, List ids) { if (category.getChildren() != null && !category.getChildren().isEmpty()) { for (CategoryVO child : category.getChildren()) { ids.add(child.getId()); this.findAllChildIds(child, ids); } } } /** * 递归自身,找到id等于parentId的对象,获取他的children 返回 * * @param parentId 父ID * @param categoryVOList 分类VO * @return 子分类列表VO */ private List getChildren(String parentId, List categoryVOList) { for (CategoryVO item : categoryVOList) { if (item.getId().equals(parentId)) { return item.getChildren(); } if (item.getChildren() != null && !item.getChildren().isEmpty()) { return getChildren(parentId, item.getChildren()); } } return categoryVOList; } /** * 清除缓存 */ private void removeCache() { cache.remove(CachePrefix.CATEGORY.getPrefix()); cache.remove(CachePrefix.CATEGORY_ARRAY.getPrefix()); } }