package com.finance.system.service.impl; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.finance.common.basic.PageDTO; import com.finance.common.enums.ShowStatusEnum; import com.finance.common.exception.ServiceException; import com.finance.common.utils.BeanUtils; import com.finance.common.utils.CollUtils; import com.finance.common.utils.StringUtils; import com.finance.system.domain.TbField; import com.finance.system.domain.TbFieldCategory; import com.finance.system.dto.FieldCategoryDTO; import com.finance.system.dto.ShowHideDTO; import com.finance.system.dto.update.FieldCategoryUpdateDTO; import com.finance.system.mapper.TbFieldCategoryMapper; import com.finance.system.query.FieldCategoryQuery; import com.finance.system.service.TbFieldCategoryService; import com.finance.system.service.TbFieldService; import com.finance.system.vo.FieldCategoryDetailVO; import com.finance.system.vo.FieldCategoryVO; import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** *

* 字段分类表 服务实现类 *

* * @author mitao * @since 2024-03-13 */ @Slf4j @Service @RequiredArgsConstructor public class TbFieldCategoryServiceImpl extends ServiceImpl implements TbFieldCategoryService { private final TbFieldService tbFieldService; @Override public void add(FieldCategoryDTO dto) { //一级分类 TbFieldCategory oneCategory = new TbFieldCategory(); oneCategory.setFieldCategoryName(dto.getFieldCategoryName()); oneCategory.setSortOrder(dto.getSortOrder()); this.save(oneCategory); //二级分类 List children = dto.getChildren(); if (!CollectionUtils.isEmpty(children)) { children.forEach(item -> { TbFieldCategory twoCategory = new TbFieldCategory(); twoCategory.setParentId(oneCategory.getId()); twoCategory.setFieldCategoryName(item.getFieldCategoryName()); this.save(twoCategory); //三级分类 List next = item.getChildren(); if (!CollectionUtils.isEmpty(next)) { next.forEach(nextItem -> { TbFieldCategory threeCategory = new TbFieldCategory(); threeCategory.setParentId(twoCategory.getId()); threeCategory.setFieldCategoryName(nextItem.getFieldCategoryName()); this.save(threeCategory); }); } }); } } @Override public PageDTO queryPage(FieldCategoryQuery query) { Page page = this.lambdaQuery() .like(StringUtils.isNotBlank(query.getFieldCategoryName()), TbFieldCategory::getFieldCategoryName, query.getFieldCategoryName()) .eq(ObjectUtils.isNotEmpty(query.getStatus()), TbFieldCategory::getStatus, query.getStatus()) .eq(TbFieldCategory::getParentId, 0) .orderByDesc(TbFieldCategory::getCreateTime) .page(new Page<>(query.getPageNum(), query.getPageSize())); if (CollUtils.isEmpty(page.getRecords())) { return PageDTO.empty(page); } return PageDTO.of(page, FieldCategoryVO.class); } @Override @Transactional(rollbackFor = Exception.class) public void showHide(ShowHideDTO dto) { updateCategoryAndChildren(dto.getId(), dto.getStatus()); } private void updateCategoryAndChildren(Long id, ShowStatusEnum status) { TbFieldCategory category = this.validateParam(id); this.lambdaUpdate() .eq(TbFieldCategory::getId, id) .set(TbFieldCategory::getStatus, status) .update(); List children = this.lambdaQuery() .eq(TbFieldCategory::getParentId, category.getId()).list(); if (CollUtils.isNotEmpty(children)) { List childIds = children.stream().map(TbFieldCategory::getId) .collect(Collectors.toList()); childIds.forEach(childId -> updateCategoryAndChildren(childId, status)); } } @Override @Transactional(rollbackFor = Exception.class) public void deleteChildren(Long id) { //认定为二级分类 TbFieldCategory category = this.getById(id); if (Objects.nonNull(category)) { //查询是否有三级分类 List threeCategoryList = this.lambdaQuery() .eq(TbFieldCategory::getParentId, id).list(); if (CollectionUtils.isNotEmpty(threeCategoryList)) { List ids = threeCategoryList.stream().map(TbFieldCategory::getId) .collect(Collectors.toList()); //删除该二级分类下面的三级分类 this.removeByIds(ids); } //删除二级分类 this.removeById(id); } } @Override @Transactional(rollbackFor = Exception.class) public void delete(Long id) { //一级分类 validateParam(id); //查询是否有二级分类 List threeCategoryList = this.lambdaQuery() .eq(TbFieldCategory::getParentId, id).list(); if (CollectionUtils.isNotEmpty(threeCategoryList)) { List ids = threeCategoryList.stream().map(TbFieldCategory::getId) .collect(Collectors.toList()); //查询三级分类 List list = this.lambdaQuery().in(TbFieldCategory::getParentId, ids) .list(); if (CollectionUtils.isNotEmpty(list)) { List ids1 = list.stream().map(TbFieldCategory::getId) .collect(Collectors.toList()); //删除三级分类 this.removeByIds(ids1); } //删除二级分类 this.removeByIds(ids); } //删除一级分类 this.removeById(id); } private TbFieldCategory validateParam(Long id) { TbFieldCategory category = this.getById(id); if (Objects.isNull(category)) { throw new ServiceException("非法参数"); } return category; } @Override @Transactional(rollbackFor = Exception.class) public void edit(FieldCategoryUpdateDTO dto) { log.info("主线程名{}", Thread.currentThread().getName()); validateParam(dto.getId()); //更新一级分类 TbFieldCategory category1 = updateCategory(dto, null); CompletableFuture.runAsync(() -> handleFieldCategory(category1)); List children = dto.getChildren(); //更新二级分类 if (CollUtils.isNotEmpty(children)) { children.forEach(item -> { //二级分类 TbFieldCategory category2 = updateCategory(item, category1); CompletableFuture.runAsync(() -> handleFieldCategory(category2)); //三级分类 List next = item.getChildren(); if (!CollectionUtils.isEmpty(next)) { for (FieldCategoryUpdateDTO fieldCategoryUpdateDTO : next) { TbFieldCategory category3 = updateCategory(fieldCategoryUpdateDTO, category2); CompletableFuture.runAsync(() -> handleFieldCategory(category3)); } } }); } } protected void handleFieldCategory(TbFieldCategory category) { log.info("开始处理字段分类名称同步,线程名{}", Thread.currentThread().getName()); //查询使用到该分类的字段 List list1 = tbFieldService.list(Wrappers.lambdaQuery() .eq(TbField::getLevelOneCategoryId, category.getId())); if (CollUtils.isNotEmpty(list1)) { List fieldList = list1.stream().peek(item -> { item.setLevelOneCategoryId(category.getId()); item.setLevelOneCategory(category.getFieldCategoryName()); }).collect(Collectors.toList()); tbFieldService.updateBatchById(fieldList); } List list2 = tbFieldService.list(Wrappers.lambdaQuery() .eq(TbField::getLevelTwoCategoryId, category.getId())); if (CollUtils.isNotEmpty(list2)) { List fieldList = list2.stream().peek(item -> { item.setLevelTwoCategoryId(category.getId()); item.setLevelTwoCategory(category.getFieldCategoryName()); }).collect(Collectors.toList()); tbFieldService.updateBatchById(fieldList); } List list3 = tbFieldService.list(Wrappers.lambdaQuery() .eq(TbField::getLevelThreeCategoryId, category.getId())); if (CollUtils.isNotEmpty(list2)) { List fieldList = list3.stream().peek(item -> { item.setLevelThreeCategoryId(category.getParentId()); item.setLevelThreeCategory(category.getFieldCategoryName()); }).collect(Collectors.toList()); tbFieldService.updateBatchById(fieldList); } } private TbFieldCategory updateCategory(FieldCategoryUpdateDTO dto, TbFieldCategory parent) { TbFieldCategory category = BeanUtils.copyBean(dto, TbFieldCategory.class); if (Objects.isNull(dto.getId()) && Objects.nonNull(parent)) { assert category != null; category.setParentId(parent.getId()); this.save(category); } else { this.updateById(category); } return category; } @Override public List queryFieldCategories(Long id) { List list = this.lambdaQuery() .select(TbFieldCategory::getId, TbFieldCategory::getFieldCategoryName) .eq(TbFieldCategory::getParentId, id) .eq(TbFieldCategory::getStatus, ShowStatusEnum.SHOW) .list(); return BeanUtils.copyList(list, FieldCategoryVO.class); } @Override public FieldCategoryDetailVO getDetailsById(Long id) { TbFieldCategory oneCategory = this.getById(id); if (Objects.isNull(oneCategory)) { return new FieldCategoryDetailVO(); } FieldCategoryDetailVO vo = BeanUtils.copyBean(oneCategory, FieldCategoryDetailVO.class); //根据一级分类id,查询二级分类 List twoCategoryList = this.lambdaQuery() .eq(TbFieldCategory::getParentId, oneCategory.getId()).list(); twoCategoryList.forEach(item -> { FieldCategoryDetailVO twoCategoryVO = BeanUtils.copyBean(item, FieldCategoryDetailVO.class); vo.getChildren().add(twoCategoryVO); //根据二级分类id,查询三级分类 List threeCategoryList = this.lambdaQuery() .eq(TbFieldCategory::getParentId, item.getId()).list(); threeCategoryList.forEach(threeCategory -> { FieldCategoryDetailVO threeCategoryVO = BeanUtils.copyBean(threeCategory, FieldCategoryDetailVO.class); twoCategoryVO.getChildren().add(threeCategoryVO); }); }); return vo; } }