package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.basic.PageDTO;
import com.ruoyi.common.enums.ShowStatusEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.BeanUtils;
import com.ruoyi.common.utils.CollUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.TbFieldCategory;
import com.ruoyi.system.dto.FieldCategoryDTO;
import com.ruoyi.system.dto.ShowHideDTO;
import com.ruoyi.system.dto.update.FieldCategoryUpdateDTO;
import com.ruoyi.system.mapper.TbFieldCategoryMapper;
import com.ruoyi.system.query.FieldCategoryQuery;
import com.ruoyi.system.service.TbFieldCategoryService;
import com.ruoyi.system.vo.FieldCategoryDetailVO;
import com.ruoyi.system.vo.FieldCategoryVO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
*
* 字段分类表 服务实现类
*
*
* @author mitao
* @since 2024-03-13
*/
@Service
public class TbFieldCategoryServiceImpl extends ServiceImpl implements TbFieldCategoryService {
@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
public void edit(FieldCategoryUpdateDTO dto) {
validateParam(dto.getId());
//更新一级分类
updateCategory(dto);
List children = dto.getChildren();
//更新二级分类
if (!CollectionUtils.isEmpty(children)) {
children.forEach(item->{
updateCategory(item);
//三级分类
List next = item.getChildren();
if (!CollectionUtils.isEmpty(next)) {
next.forEach(this::updateCategory);
}
});
}
}
private void updateCategory(FieldCategoryUpdateDTO dto) {
if (dto == null) return;
this.lambdaUpdate()
.set(TbFieldCategory::getFieldCategoryName, dto.getFieldCategoryName())
.set(Objects.nonNull(dto.getSortOrder()),TbFieldCategory::getSortOrder, dto.getSortOrder())
.eq(TbFieldCategory::getId, dto.getId())
.update();
}
@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;
}
}