package com.ruoyi.project.tr.region.service; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.exception.BusinessException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.security.ShiroUtils; import com.ruoyi.framework.aspectj.lang.annotation.DataScope; import com.ruoyi.framework.web.domain.Ztree; import com.ruoyi.project.system.role.domain.Role; import com.ruoyi.project.tr.region.domain.Region; import com.ruoyi.project.tr.region.mapper.RegionMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; /** * 区域/位置管理 服务实现 * * @author ruoyi */ @Service public class RegionServiceImpl implements IRegionService { @Autowired private RegionMapper regionMapper; /** * 查询区域/位置管理数据 * * @param region 区域/位置信息 * @return 区域/位置信息集合 */ @Override @DataScope(deptAlias = "d") public List selectRegionList(Region region) { return regionMapper.selectRegionList(region); } @Override public List selectRegionListByCompanyId(Long companyId) { Region region = new Region(); region.setCompanyId(companyId); return regionMapper.selectRegionList(region); } /** * 查询区域/位置管理树 * * @param region 区域/位置信息 * @return 所有区域/位置信息 */ @Override @DataScope(deptAlias = "d") public List selectRegionTree(Region region) { List regionList = regionMapper.selectRegionList(region); List ztrees = initZtree(regionList); return ztrees; } /** * 根据角色ID查询区域/位置(数据权限) * * @param role 角色对象 * @return 区域/位置列表(数据权限) */ @Override public List roleRegionTreeData(Role role) { Long roleId = role.getRoleId(); List ztrees = new ArrayList(); Region region = new Region(); region.setCompanyId(role.getCompanyId()); List regionList = selectRegionList(region); if (StringUtils.isNotNull(roleId)) { List roleRegionList = regionMapper.selectRoleRegionTree(roleId,role.getCompanyId()); ztrees = initZtree(regionList, roleRegionList); } else { ztrees = initZtree(regionList); } return ztrees; } /** * 对象转区域/位置树 * * @param regionList 区域/位置列表 * @return 树结构列表 */ public List initZtree(List regionList) { return initZtree(regionList, null); } /** * 对象转区域/位置树 * * @param regionList 区域/位置列表 * @param roleRegionList 角色已存在菜单列表 * @return 树结构列表 */ public List initZtree(List regionList, List roleRegionList) { List ztrees = new ArrayList(); boolean isCheck = StringUtils.isNotNull(roleRegionList); for (Region region : regionList) { if (UserConstants.DEPT_NORMAL.equals(region.getStatus())) { Ztree ztree = new Ztree(); ztree.setId(region.getRegionId()); ztree.setpId(region.getParentId()); ztree.setName(region.getRegionName()); ztree.setTitle(region.getRegionName()); if (isCheck) { ztree.setChecked(roleRegionList.contains(region.getRegionId() + region.getRegionName())); } ztrees.add(ztree); } } return ztrees; } /** * 查询区域/位置人数 * * @param parentId 区域/位置ID * @return 结果 */ @Override public int selectRegionCount(Long parentId) { Region region = new Region(); region.setParentId(parentId); return regionMapper.selectRegionCount(region); } /** * 查询区域/位置是否存在用户 * * @param regionId 区域/位置ID * @return 结果 true 存在 false 不存在 */ @Override public boolean checkRegionExistUser(Long regionId) { int result = regionMapper.checkRegionExistUser(regionId); return result > 0; } /** * 删除区域/位置管理信息 * * @param regionId 区域/位置ID * @return 结果 */ @Override public int deleteRegionById(Long regionId) { return regionMapper.deleteRegionById(regionId); } /** * 新增保存区域/位置信息 * * @param region 区域/位置信息 * @return 结果 */ @Override public int insertRegion(Region region) { if (region.getParentId()!=0L){ Region info = regionMapper.selectRegionById(region.getParentId()); // 如果父节点不为"正常"状态,则不允许新增子节点 if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) { throw new BusinessException("区域/位置停用,不允许新增"); }else{ region.setAncestors("0"); } region.setAncestors(info.getAncestors() + "," + region.getParentId()); } region.setCreateBy(ShiroUtils.getLoginName()); return regionMapper.insertRegion(region); } /** * 修改保存区域/位置信息 * * @param region 区域/位置信息 * @return 结果 */ @Override @Transactional public int updateRegion(Region region) { Region newParentRegion = regionMapper.selectRegionById(region.getParentId()); Region oldRegion = selectRegionById(region.getRegionId()); if (StringUtils.isNotNull(newParentRegion) && StringUtils.isNotNull(oldRegion)) { String newAncestors = newParentRegion.getAncestors() + "," + newParentRegion.getRegionId(); String oldAncestors = oldRegion.getAncestors(); region.setAncestors(newAncestors); updateRegionChildren(region.getRegionId(), newAncestors, oldAncestors); } region.setUpdateBy(ShiroUtils.getLoginName()); int result = regionMapper.updateRegion(region); if (UserConstants.DEPT_NORMAL.equals(region.getStatus())) { // 如果该区域/位置是启用状态,则启用该区域/位置的所有上级区域/位置 updateParentRegionStatus(region); } return result; } /** * 修改该区域/位置的父级区域/位置状态 * * @param region 当前区域/位置 */ private void updateParentRegionStatus(Region region) { String updateBy = region.getUpdateBy(); region = regionMapper.selectRegionById(region.getRegionId()); region.setUpdateBy(updateBy); regionMapper.updateRegionStatus(region); } /** * 修改子元素关系 * * @param regionId 被修改的区域/位置ID * @param newAncestors 新的父ID集合 * @param oldAncestors 旧的父ID集合 */ public void updateRegionChildren(Long regionId, String newAncestors, String oldAncestors) { List children = regionMapper.selectChildrenRegionById(regionId); for (Region child : children) { child.setAncestors(child.getAncestors().replace(oldAncestors, newAncestors)); } if (children.size() > 0) { regionMapper.updateRegionChildren(children); } } /** * 修改子元素关系 * * @param regionId 区域/位置ID * @param ancestors 元素列表 */ public void updateRegionChildren(Long regionId, String ancestors) { Region region = new Region(); region.setParentId(regionId); List childrens = regionMapper.selectRegionList(region); for (Region children : childrens) { children.setAncestors(ancestors + "," + region.getParentId()); } if (childrens.size() > 0) { regionMapper.updateRegionChildren(childrens); } } /** * 根据区域/位置ID查询信息 * * @param regionId 区域/位置ID * @return 区域/位置信息 */ @Override public Region selectRegionById(Long regionId) { return regionMapper.selectRegionById(regionId); } /** * 校验区域/位置名称是否唯一 * * @param region 区域/位置信息 * @return 结果 */ @Override public String checkRegionNameUnique(Region region) { Long regionId = StringUtils.isNull(region.getRegionId()) ? -1L : region.getRegionId(); Region info = regionMapper.checkRegionNameUnique(region.getRegionName(), region.getParentId(),region.getCompanyId()); if (StringUtils.isNotNull(info) && info.getRegionId().longValue() != regionId.longValue()) { return UserConstants.DEPT_NAME_NOT_UNIQUE; } return UserConstants.DEPT_NAME_UNIQUE; } }