package com.ruoyi.system.service.impl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysVisitArea; import com.ruoyi.system.dto.SysVisitAreaAddRequest; import com.ruoyi.system.dto.SysVisitAreaDeleteRequest; import com.ruoyi.system.dto.SysVisitAreaDetailRequest; import com.ruoyi.system.dto.SysVisitAreaEditRequest; import com.ruoyi.system.dto.SysVisitAreaTreeRequest; import com.ruoyi.system.mapper.SysVisitAreaMapper; import com.ruoyi.system.service.ISysVisitAreaService; import com.ruoyi.system.vo.SysVisitAreaVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * 访问区域服务实现 * * @author ruoyi */ @Service public class SysVisitAreaServiceImpl implements ISysVisitAreaService { @Autowired private SysVisitAreaMapper visitAreaMapper; @Override public List tree(SysVisitAreaTreeRequest request) { SysVisitAreaTreeRequest query = request == null ? new SysVisitAreaTreeRequest() : request; query.setAreaName(StringUtils.trim(query.getAreaName())); return buildTree(visitAreaMapper.selectAreaTreeList(query)); } @Override public SysVisitAreaVO detail(SysVisitAreaDetailRequest request) { Long areaId = getRequiredAreaId(request == null ? null : request.getAreaId()); SysVisitAreaVO detail = visitAreaMapper.selectVoById(areaId); if (detail == null) { throw new ServiceException("访问区域不存在"); } return detail; } @Override public int add(SysVisitAreaAddRequest request, String username) { if (request == null) { throw new ServiceException("访问区域内容不能为空"); } Long parentId = getParentId(request.getParentId()); SysVisitArea parent = getParentArea(parentId); String areaName = getRequiredAreaName(request.getAreaName()); String areaCode = trimToNull(request.getAreaCode()); checkUnique(areaName, areaCode, parentId, null); SysVisitArea area = new SysVisitArea(); area.setParentId(parentId); area.setAncestors(getAncestors(parent)); area.setAreaCode(areaCode); area.setAreaName(areaName); area.setAreaDesc(StringUtils.trim(request.getAreaDesc())); area.setOrderNum(request.getOrderNum() == null ? 0 : request.getOrderNum()); area.setCreateBy(username); return visitAreaMapper.insertArea(area); } @Override public int edit(SysVisitAreaEditRequest request, String username) { if (request == null) { throw new ServiceException("访问区域内容不能为空"); } Long areaId = getRequiredAreaId(request.getAreaId()); SysVisitArea oldArea = visitAreaMapper.selectById(areaId); if (oldArea == null) { throw new ServiceException("访问区域不存在"); } Long parentId = getParentId(request.getParentId()); if (Objects.equals(areaId, parentId)) { throw new ServiceException("上级区域不能选择自身"); } SysVisitArea parent = getParentArea(parentId); if (parent != null && containsAncestor(parent.getAncestors(), areaId)) { throw new ServiceException("上级区域不能选择当前区域的下级"); } String areaName = getRequiredAreaName(request.getAreaName()); String areaCode = trimToNull(request.getAreaCode()); checkUnique(areaName, areaCode, parentId, areaId); String newAncestors = getAncestors(parent); SysVisitArea area = new SysVisitArea(); area.setAreaId(areaId); area.setParentId(parentId); area.setAncestors(newAncestors); area.setAreaCode(areaCode); area.setAreaName(areaName); area.setAreaDesc(StringUtils.trim(request.getAreaDesc())); area.setOrderNum(request.getOrderNum() == null ? 0 : request.getOrderNum()); area.setUpdateBy(username); int rows = visitAreaMapper.updateArea(area); String oldChildAncestors = appendAncestor(oldArea.getAncestors(), areaId); String newChildAncestors = appendAncestor(newAncestors, areaId); if (!Objects.equals(oldChildAncestors, newChildAncestors)) { visitAreaMapper.updateChildrenAncestors(areaId, oldChildAncestors, newChildAncestors); } return rows; } @Override public int delete(SysVisitAreaDeleteRequest request, String username) { if (request == null || CollectionUtils.isEmpty(request.getAreaIds())) { throw new ServiceException("区域主键集合不能为空"); } for (Long areaId : request.getAreaIds()) { getRequiredAreaId(areaId); } return visitAreaMapper.deleteByIds(request.getAreaIds(), username); } /** * 构建前端所需区域树。 */ private List buildTree(List areas) { List returnList = new ArrayList(); List tempList = areas.stream().map(SysVisitAreaVO::getAreaId).collect(Collectors.toList()); for (SysVisitAreaVO area : areas) { if (area.getParentId() == null || area.getParentId() == 0 || !tempList.contains(area.getParentId())) { recursionFn(areas, area); returnList.add(area); } } if (returnList.isEmpty()) { returnList = areas; } return returnList; } private void recursionFn(List list, SysVisitAreaVO area) { List childList = getChildList(list, area); area.setChildren(childList); for (SysVisitAreaVO child : childList) { if (!getChildList(list, child).isEmpty()) { recursionFn(list, child); } } } private List getChildList(List list, SysVisitAreaVO area) { List result = new ArrayList(); Iterator it = list.iterator(); while (it.hasNext()) { SysVisitAreaVO current = it.next(); if (current.getParentId() != null && current.getParentId().longValue() == area.getAreaId().longValue()) { result.add(current); } } return result; } private Long getRequiredAreaId(Long areaId) { if (areaId == null || areaId <= 0) { throw new ServiceException("区域主键不能为空"); } return areaId; } private Long getParentId(Long parentId) { if (parentId == null) { return 0L; } if (parentId < 0) { throw new ServiceException("上级区域不正确"); } return parentId; } private SysVisitArea getParentArea(Long parentId) { if (parentId == 0) { return null; } SysVisitArea parent = visitAreaMapper.selectById(parentId); if (parent == null) { throw new ServiceException("上级区域不存在"); } return parent; } private String getRequiredAreaName(String areaName) { String value = StringUtils.trim(areaName); if (StringUtils.isEmpty(value)) { throw new ServiceException("区域名称不能为空"); } return value; } private String trimToNull(String value) { String result = StringUtils.trim(value); return StringUtils.isEmpty(result) ? null : result; } private void checkUnique(String areaName, String areaCode, Long parentId, Long excludeAreaId) { if (visitAreaMapper.checkAreaNameUnique(areaName, parentId, excludeAreaId) != null) { throw new ServiceException("同级区域名称已存在"); } if (StringUtils.isNotEmpty(areaCode) && visitAreaMapper.checkAreaCodeUnique(areaCode, excludeAreaId) != null) { throw new ServiceException("区域编码已存在"); } } private String getAncestors(SysVisitArea parent) { if (parent == null) { return "0"; } return appendAncestor(parent.getAncestors(), parent.getAreaId()); } private String appendAncestor(String ancestors, Long areaId) { String prefix = StringUtils.isEmpty(ancestors) ? "0" : ancestors; return prefix + "," + areaId; } private boolean containsAncestor(String ancestors, Long areaId) { if (StringUtils.isEmpty(ancestors) || areaId == null) { return false; } String target = String.valueOf(areaId); for (String ancestor : ancestors.split(",")) { if (target.equals(ancestor)) { return true; } } return false; } }