package com.ruoyi.system.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.dto.asset.AssetTypeDTO; import com.ruoyi.system.mapper.AssetTypeMapper; import com.ruoyi.system.model.AssetMain; import com.ruoyi.system.model.AssetType; import com.ruoyi.system.service.AssetMainService; import com.ruoyi.system.service.AssetTypeService; import com.ruoyi.system.vo.asset.AssetTypeTreeVO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; /** *

* 资产类型表 服务实现类 *

* * @author WuGuanFengYue * @since 2025-09-15 */ @Service @RequiredArgsConstructor public class AssetTypeServiceImpl extends ServiceImpl implements AssetTypeService { private final AssetMainService assetMainService; @Override public List getAssetTypeTree() { // 查询所有未删除的资产类型数据 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByAsc(AssetType::getLevel) .orderByAsc(AssetType::getId); List allAssetTypes = this.list(queryWrapper); if (CollUtil.isEmpty(allAssetTypes)) { return new ArrayList<>(); } // 转换为VO对象 List assetTypeVOs = BeanUtil.copyToList(allAssetTypes, AssetTypeTreeVO.class); // 按父级ID分组 Map> parentIdMap = assetTypeVOs.stream() .collect(Collectors.groupingBy(AssetTypeTreeVO::getParentId)); // 构建树形结构 List rootNodes = parentIdMap.get(0); if (CollUtil.isEmpty(rootNodes)) { return new ArrayList<>(); } // 为每个根节点设置子节点 for (AssetTypeTreeVO rootNode : rootNodes) { List children = parentIdMap.get(rootNode.getId()); rootNode.setChildren(children != null ? children : new ArrayList<>()); } return rootNodes; } @Override public void addAssetType(AssetTypeDTO dto) { // 校验资产类型名称是否重复 LambdaQueryWrapper nameQueryWrapper = new LambdaQueryWrapper<>(); nameQueryWrapper.eq(AssetType::getTypeName, dto.getTypeName()); AssetType existingByName = this.getOne(nameQueryWrapper); if (Objects.nonNull(existingByName)) { throw new ServiceException("资产类型名称已存在"); } // 校验资产简写是否重复 LambdaQueryWrapper codeQueryWrapper = new LambdaQueryWrapper<>(); codeQueryWrapper.eq(AssetType::getTypeCode, dto.getTypeCode()); AssetType existingByCode = this.getOne(codeQueryWrapper); if (Objects.nonNull(existingByCode)) { throw new ServiceException("资产类型简写已存在"); } // 创建资产类型对象 AssetType assetType = new AssetType(); assetType.setTypeName(dto.getTypeName()); assetType.setTypeCode(dto.getTypeCode()); // 处理层级逻辑 if (Objects.isNull(dto.getParentId()) || dto.getParentId().equals(0)) { // 添加一级资产类型 assetType.setParentId(0); assetType.setLevel(1); } else { // 添加二级资产类型,先校验父级是否存在 AssetType parentAssetType = this.getById(dto.getParentId()); if (Objects.isNull(parentAssetType)) { throw new ServiceException("父级资产类型不存在"); } if (!parentAssetType.getLevel().equals(1)) { throw new ServiceException("只能在一级资产类型下添加二级资产类型"); } assetType.setParentId(dto.getParentId()); assetType.setLevel(2); } // 设置创建信息 String username = SecurityUtils.getUsername(); assetType.setCreateBy(username); // 保存资产类型 this.save(assetType); } @Override public void editAssetType(AssetTypeDTO dto) { // 校验资产类型ID是否为空 if (Objects.isNull(dto.getId())) { throw new ServiceException("资产类型ID不能为空"); } // 校验资产类型是否存在 AssetType existingAssetType = this.getById(dto.getId()); if (Objects.isNull(existingAssetType)) { throw new ServiceException("资产类型不存在"); } // 校验是否有关联的资产记录 LambdaQueryWrapper assetMainQueryWrapper = new LambdaQueryWrapper<>(); assetMainQueryWrapper.eq(AssetMain::getAssetTypeId, dto.getId()); long assetMainCount = assetMainService.count(assetMainQueryWrapper); if (assetMainCount > 0) { throw new ServiceException("该资产类型已关联资产记录,不能编辑"); } // 校验资产类型名称是否重复(排除自身) LambdaQueryWrapper nameQueryWrapper = new LambdaQueryWrapper<>(); nameQueryWrapper.eq(AssetType::getTypeName, dto.getTypeName()) .ne(AssetType::getId, dto.getId()); AssetType existingByName = this.getOne(nameQueryWrapper); if (Objects.nonNull(existingByName)) { throw new ServiceException("资产类型名称已存在"); } // 校验资产简写是否重复(排除自身) LambdaQueryWrapper codeQueryWrapper = new LambdaQueryWrapper<>(); codeQueryWrapper.eq(AssetType::getTypeCode, dto.getTypeCode()) .ne(AssetType::getId, dto.getId()); AssetType existingByCode = this.getOne(codeQueryWrapper); if (Objects.nonNull(existingByCode)) { throw new ServiceException("资产简写已存在"); } // 更新资产类型信息 AssetType assetType = new AssetType(); assetType.setId(dto.getId()); assetType.setTypeName(dto.getTypeName()); assetType.setTypeCode(dto.getTypeCode()); // 设置更新信息 String username = SecurityUtils.getUsername(); assetType.setUpdateBy(username); // 更新资产类型 this.updateById(assetType); } @Override public void deleteAssetType(Integer id) { // 校验资产类型ID是否为空 if (Objects.isNull(id)) { throw new ServiceException("资产类型ID不能为空"); } // 校验资产类型是否存在 AssetType existingAssetType = this.getById(id); if (Objects.isNull(existingAssetType)) { throw new ServiceException("资产类型不存在"); } // 校验是否有子类型 LambdaQueryWrapper childQueryWrapper = new LambdaQueryWrapper<>(); childQueryWrapper.eq(AssetType::getParentId, id); long childCount = this.count(childQueryWrapper); if (childCount > 0) { throw new ServiceException("该资产类型存在子类型,不能删除"); } // 校验是否有关联的资产记录 LambdaQueryWrapper assetMainQueryWrapper = new LambdaQueryWrapper<>(); assetMainQueryWrapper.eq(AssetMain::getAssetTypeId, id); long assetMainCount = assetMainService.count(assetMainQueryWrapper); if (assetMainCount > 0) { throw new ServiceException("该资产类型已关联资产记录,不能删除"); } // 删除资产类型 this.removeById(id); } }