From 5f366e546806a5690ff7a5770857048663e4521a Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Mon, 15 Sep 2025 16:17:11 +0800 Subject: [PATCH] feat(ai): 增加公司 ID 筛选功能 --- src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java | 99 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 96 insertions(+), 3 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java index a64f47e..23dd18f 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiProductCategoryServiceImpl.java @@ -2,13 +2,16 @@ import cc.mrbird.febs.ai.entity.AiMemberRole; import cc.mrbird.febs.ai.entity.AiProductCategory; +import cc.mrbird.febs.ai.enums.ProductCategoryLevelEnum; import cc.mrbird.febs.ai.mapper.AiProductCategoryMapper; import cc.mrbird.febs.ai.service.AiProductCategoryService; import cc.mrbird.febs.ai.util.UUID; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.common.exception.FebsException; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -20,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.stream.Collectors; /** * AI产品类别 Service实现类 @@ -40,12 +44,48 @@ } @Override - public List<AiProductCategory> getList() { + public List<AiProductCategory> getList(String companyId) { LambdaQueryWrapper<AiProductCategory> query = Wrappers.lambdaQuery(AiProductCategory.class); + if (StrUtil.isNotEmpty(companyId)){ + query.eq(AiProductCategory::getCompanyId, companyId); + } query.ne(AiProductCategory::getState, 2); + query.eq(AiProductCategory::getLevel, ProductCategoryLevelEnum.LEVEL_ONE.getLevel()); query.orderByDesc(AiProductCategory::getHotState); query.orderByAsc(AiProductCategory::getSort); List<AiProductCategory> aiProductCategories = aiProductCategoryMapper.selectList(query); + if (CollUtil.isNotEmpty(aiProductCategories)){ + Set<String> parentIds = aiProductCategories.stream().map(AiProductCategory::getId).collect(Collectors.toSet()); + if (CollUtil.isNotEmpty(parentIds)){ + List<AiProductCategory> aiProductCategoriesChild = aiProductCategoryMapper.selectList( + Wrappers.lambdaQuery(AiProductCategory.class) + .in(AiProductCategory::getParentId, parentIds) + .ne(AiProductCategory::getState, 2) + .eq(AiProductCategory::getLevel, ProductCategoryLevelEnum.LEVEL_TWO.getLevel()) + .orderByAsc(AiProductCategory::getSort) + ); + + //Stream流操作aiProductCategoriesChild,返回一个Map<ParentId,List<AiProductCategory>>,List<AiProductCategory>按照sort排序 + Map<String, List<AiProductCategory>> resultMap = aiProductCategoriesChild.stream() + .collect(Collectors.groupingBy( + AiProductCategory::getParentId, + Collectors.collectingAndThen( + Collectors.toList(), + list -> list.stream() + .sorted(Comparator.comparing(AiProductCategory::getSort)) + .collect(Collectors.toList()) + ) + )); + if (CollUtil.isNotEmpty(resultMap)){ + aiProductCategories.forEach(aiProductCategory -> { + List<AiProductCategory> collect = resultMap.get(aiProductCategory.getId()); + if (CollUtil.isNotEmpty(collect)){ + aiProductCategory.setChild(collect); + } + }); + } + } + } return aiProductCategories; } @@ -70,10 +110,32 @@ Page<AiProductCategory> page = new Page<>(request.getPageNum(), request.getPageSize()); LambdaQueryWrapper<AiProductCategory> query = Wrappers.lambdaQuery(AiProductCategory.class); + if (StrUtil.isNotEmpty(dto.getCompanyId())){ + query.eq(AiProductCategory::getCompanyId, dto.getCompanyId()); + } query.ne(AiProductCategory::getState, 2); query.orderByDesc(AiProductCategory::getHotState); query.orderByAsc(AiProductCategory::getSort); Page<AiProductCategory> pages = aiProductCategoryMapper.selectPage(page, query); + List<AiProductCategory> records = pages.getRecords(); + if (CollUtil.isNotEmpty( records)){ + //stream流获取全部的parentId + Set<String> parentIds = records.stream().map(AiProductCategory::getParentId).collect(Collectors.toSet()); + if (CollUtil.isNotEmpty(parentIds)){ + List<AiProductCategory> aiProductCategories = aiProductCategoryMapper.selectList( + Wrappers.lambdaUpdate(AiProductCategory.class) + .in(AiProductCategory::getId, parentIds) + ); + Map<String, AiProductCategory> map = aiProductCategories.stream().collect( + Collectors.toMap(AiProductCategory::getId, aiProductCategory -> aiProductCategory)); + records.forEach(aiProductCategory -> { + AiProductCategory orDefault = map.getOrDefault(aiProductCategory.getParentId(), null); + if(ObjectUtil.isNotNull(orDefault)){ + aiProductCategory.setParentName(orDefault.getName()); + } + }); + } + } return pages; } @@ -110,6 +172,8 @@ entity.setIconImg(dto.getIconImg()); entity.setSort(dto.getSort()); entity.setCreatedTime(new Date()); + entity.setParentId(dto.getParentId()); + entity.setLevel(StrUtil.isNotEmpty(dto.getParentId()) ? 2 : 1); this.save(entity); return new FebsResponse().success().message("操作成功"); } @@ -118,6 +182,21 @@ public FebsResponse update(AiProductCategory dto) { String id = dto.getId(); AiProductCategory entity = this.getById(id); + dto.setLevel(ProductCategoryLevelEnum.LEVEL_ONE.getLevel()); + String parentId = dto.getParentId(); + if (parentId.equals( id)){ + throw new FebsException("父类不能选择自己"); + } + if (StrUtil.isNotEmpty(parentId)){ + AiProductCategory parent = this.getById(parentId); + if ( + ObjectUtil.isNotNull(parent) + && parent.getLevel() < ProductCategoryLevelEnum.LEVEL_TWO.getLevel() + ){ + dto.setLevel(parent.getLevel() +1); + dto.setParentId(parentId); + } + } if (ObjectUtil.isNotNull( entity)){ this.update(null, Wrappers.lambdaUpdate(AiProductCategory.class) @@ -127,6 +206,8 @@ .set(AiProductCategory::getIconImg, dto.getIconImg()) .set(AiProductCategory::getSort, dto.getSort()) .set(AiProductCategory::getUpdatedTime, new Date()) + .set(AiProductCategory::getParentId, dto.getParentId()) + .set(AiProductCategory::getLevel, dto.getLevel()) .eq(AiProductCategory::getId, id) ); } @@ -149,7 +230,19 @@ } @Override - public List<AiProductCategory> categoryTree() { - return this.getList() ; + public List<AiProductCategory> categoryTree(String companyId) { + return this.getList(companyId) ; + } + + @Override + public List<AiProductCategory> parent(String companyId) { + LambdaQueryWrapper<AiProductCategory> query = Wrappers.lambdaQuery(AiProductCategory.class); + query.select(AiProductCategory::getId,AiProductCategory::getName); + if (StrUtil.isNotEmpty(companyId)){ + query.eq(AiProductCategory::getCompanyId, companyId); + } + query.eq(AiProductCategory::getLevel, 1); + query.ne(AiProductCategory::getState, 2); + return this.getBaseMapper().selectList(query); } } -- Gitblit v1.9.1