From e073edc3d697df3b255de05df11c0f24aed0adbd Mon Sep 17 00:00:00 2001 From: huangfeng Date: Mon, 18 Mar 2024 17:14:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E5=90=8E=E7=9A=84id=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=EF=BC=8C=E6=94=B9=E7=94=A8=E7=BC=93=E5=AD=98=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RoleController.java | 11 +- .../bean/PermissionDetail.java | 37 +++- .../shxy/xymanager_common/entity/DyLevel.java | 15 ++ .../shxy/xymanager_common/entity/Lines.java | 15 ++ .../xymanager_common/entity/Terminals.java | 10 + .../shxy/xymanager_common/entity/Towers.java | 13 ++ .../impl/LineServiceImpl.java | 4 + .../impl/NewCacheServiceImpl.java | 187 ++++++++++++++++++ .../impl/PermissionServiceImpl.java | 2 + .../impl/RoleServiceImpl.java | 74 ------- .../impl/TerminalServiceImpl.java | 5 + .../impl/TowerServiceImpl.java | 4 + .../service/NewCacheService.java | 14 ++ .../service/RoleService.java | 4 - 14 files changed, 308 insertions(+), 87 deletions(-) create mode 100644 xymanager_service/src/main/java/com/shxy/xymanager_service/impl/NewCacheServiceImpl.java create mode 100644 xymanager_service/src/main/java/com/shxy/xymanager_service/service/NewCacheService.java diff --git a/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/RoleController.java b/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/RoleController.java index c2434f0..3e453f2 100644 --- a/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/RoleController.java +++ b/xymanager_admin/src/main/java/com/shxy/xymanager_admin/controller/RoleController.java @@ -7,6 +7,7 @@ import com.shxy.xymanager_common.bean.ServiceStatus; import com.shxy.xymanager_common.entity.DyLevel; import com.shxy.xymanager_common.entity.TbRole; import com.shxy.xymanager_common.exception.ApiException; +import com.shxy.xymanager_service.service.NewCacheService; import com.shxy.xymanager_service.service.RoleService; import io.swagger.annotations.Api; @@ -27,6 +28,8 @@ public class RoleController extends BaseController { @Resource RoleService service; + @Resource + NewCacheService cacheService; @GetMapping("listAll") @ApiOperation("查询全部列表") @@ -65,12 +68,8 @@ public class RoleController extends BaseController { @GetMapping("getPermissionTree") @ApiOperation("查询权限树状图") public ResponseReult> getPermissionTree() { - ServiceBody> serviceBody = service.getPermissionTree(); - if (serviceBody.getCode() == ServiceStatus.SUCCESS) { - return ResponseReult.success(serviceBody.getData()); - } else { - return ResponseReult.error(serviceBody.getCode(), serviceBody.getMsg()); - } + List list = cacheService.getFullTree(); + return ResponseReult.success(list); } } diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/PermissionDetail.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/PermissionDetail.java index 9c03a40..c7b3d58 100644 --- a/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/PermissionDetail.java +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/bean/PermissionDetail.java @@ -25,7 +25,38 @@ public class PermissionDetail { private Integer isSuper = CommonStatus.DELETE.value(); - private Integer uid ; - - + private Integer uid; + + + public boolean hasDyId(Integer id) { + if (dypList.contains(id)) { + return true; + } else { + return false; + } + } + + public boolean hasLineId(Integer id) { + if (linepList.contains(id)) { + return true; + } else { + return false; + } + } + + public boolean hasTowerId(Integer id) { + if (towerpList.contains(id)) { + return true; + } else { + return false; + } + } + + public boolean hasTermId(Integer id) { + if (termpList.contains(id)) { + return true; + } else { + return false; + } + } } diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/DyLevel.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/DyLevel.java index 3342820..33bd9fd 100644 --- a/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/DyLevel.java +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/DyLevel.java @@ -33,6 +33,21 @@ public class DyLevel implements Serializable { @ApiModelProperty(value = "线路列表", example = "[]") public List list = new ArrayList<>(); + private boolean include; + + public boolean checkInclude() { + if (include) { + return true; + } else { + for (Lines item : list) { + if (item.checkInclude()) { + return true; + } + } + return false; + } + } + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/Lines.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/Lines.java index f3cdd19..b19a250 100644 --- a/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/Lines.java +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/Lines.java @@ -39,6 +39,21 @@ public class Lines implements Serializable { @ApiModelProperty(value = "杆塔信息", example = "123456") private List list = new ArrayList<>(); + private boolean include; + + public boolean checkInclude() { + if (include) { + return true; + } else { + for (Towers item : list) { + if (item.checkInclude()) { + return true; + } + } + return false; + } + } + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/Terminals.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/Terminals.java index 162b022..116976b 100644 --- a/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/Terminals.java +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/Terminals.java @@ -113,4 +113,14 @@ public class Terminals implements Serializable { private static final long serialVersionUID = 1L; + private boolean include; + + public boolean checkInclude() { + if (include) { + return true; + } else { + return false; + } + } + } \ No newline at end of file diff --git a/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/Towers.java b/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/Towers.java index 9cd3176..707e3f0 100644 --- a/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/Towers.java +++ b/xymanager_common/src/main/java/com/shxy/xymanager_common/entity/Towers.java @@ -106,6 +106,19 @@ public class Towers implements Serializable { private Integer isfavor; + private boolean include; + public boolean checkInclude() { + if (include) { + return true; + } else { + for (Terminals item : list) { + if (item.checkInclude()) { + return true; + } + } + return false; + } + } } \ No newline at end of file diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/LineServiceImpl.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/LineServiceImpl.java index 6fe1eb3..f3495d3 100644 --- a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/LineServiceImpl.java +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/LineServiceImpl.java @@ -18,6 +18,7 @@ import com.shxy.xymanager_service.service.CacheService; import com.shxy.xymanager_service.service.LineService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -102,6 +103,7 @@ public class LineServiceImpl implements LineService { * @return */ @Override + @CacheEvict(value = "fulltree") public ServiceBody addLine(LineVo vo) { List lines = BeanUtil.copyToList(vo.getList(), Lines.class, CopyOptions.create().ignoreCase()); Date date = new Date(); @@ -121,6 +123,7 @@ public class LineServiceImpl implements LineService { * @return */ @Override + @CacheEvict(value = "fulltree") public ServiceBody deleteLine(LineIdVo vo) { List list = vo.getList(); if (CollectionUtil.isEmpty(list)) { @@ -146,6 +149,7 @@ public class LineServiceImpl implements LineService { * @return */ @Override + @CacheEvict(value = "fulltree") public ServiceBody updateLine(UpdateLineVo vo) { Lines lines = new Lines(); lines.setId(vo.getId()); diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/NewCacheServiceImpl.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/NewCacheServiceImpl.java new file mode 100644 index 0000000..5228dfe --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/NewCacheServiceImpl.java @@ -0,0 +1,187 @@ +package com.shxy.xymanager_service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.shxy.xymanager_common.bean.PermissionDetail; +import com.shxy.xymanager_common.entity.*; +import com.shxy.xymanager_dao.dao.*; +import com.shxy.xymanager_service.service.NewCacheService; +import com.shxy.xymanager_service.service.PermissionService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + + +@Service +@Slf4j +public class NewCacheServiceImpl implements NewCacheService { + + @Resource + PermissionService permissionService; + @Resource + DyLevelDao dyLevelDao; + @Resource + LinesDao linesDao; + @Resource + TowerDao towerDao; + @Resource + TerminalsDao terminalsDao; + + @Override + @Cacheable(value = "permission_byuser", key = "#userId") + public PermissionDetail getIncludeDetail(Integer userId) { + PermissionDetail detail = permissionService.getPermissionDetail(userId); + + // 全量 + List dyList = dyLevelDao.selectByExample(new DyLevelExample()); + List lineList = linesDao.selectByExample(new LinesExample()); + List towerList = towerDao.selectByExample(new TowersExample()); + List terminalList = terminalsDao.selectByExample(new TerminalsExample()); + + HashMap dyMap = new HashMap<>(); + HashMap lineMap = new HashMap<>(); + HashMap towerMap = new HashMap<>(); + HashMap terminalMap = new HashMap<>(); + // 做map + for (DyLevel dy : dyList) { + if (detail.hasDyId(dy.getId())) { + dy.setInclude(true); + } + dyMap.put(dy.getId(), dy); + } + for (Lines line : lineList) { + if (detail.hasLineId(line.getId())) { + line.setInclude(true); + } + lineMap.put(line.getId(), line); + } + for (Towers tower : towerList) { + if (detail.hasTowerId(tower.getId())) { + tower.setInclude(true); + } + towerMap.put(tower.getId(), tower); + } + for (Terminals terminal : terminalList) { + if (detail.hasTermId(terminal.getId())) { + terminal.setInclude(true); + } + terminalMap.put(terminal.getId(), terminal); + } + + // 一层挂上一层 + for (Terminals terminal : terminalList) { + Integer towerId = terminal.getTowerId(); + if (towerId != null) { + Towers tower = towerMap.get(towerId); + if (tower != null) { + tower.getList().add(terminal); + } + } + } + for (Towers tower : towerList) { + Integer lineId = tower.getLineid(); + if (lineId != null) { + Lines line = lineMap.get(lineId); + if (line != null) { + line.getList().add(tower); + } + } + } + for (Lines line : lineList) { + Integer dyLevelId = line.getDyLevelId(); + if (dyLevelId != null) { + DyLevel dyLevel = dyMap.get(dyLevelId); + if (dyLevel != null) { + dyLevel.getList().add(line); + } + } + } + + // 找出相关的 + detail = new PermissionDetail(); + for (DyLevel dy : dyList) { + if (dy.checkInclude()) { + detail.getDypList().add(dy.getId()); + } + } + for (Lines line : lineList) { + if (line.checkInclude()) { + detail.getLinepList().add(line.getId()); + } + } + for (Towers tower : towerList) { + if (tower.checkInclude()) { + detail.getTowerpList().add(tower.getId()); + } + } + for (Terminals terminal : terminalList) { + if (terminal.checkInclude()) { + detail.getTermpList().add(terminal.getId()); + } + } + return detail; + } + + @Override + @Cacheable(value = "fulltree") + public List getFullTree() { + // 全量 + List dyList = dyLevelDao.selectByExample(new DyLevelExample()); + List lineList = linesDao.selectByExample(new LinesExample()); + List towerList = towerDao.selectByExample(new TowersExample()); + List terminalList = terminalsDao.selectByExample(new TerminalsExample()); + if (CollectionUtil.isNotEmpty(dyList)) { + HashMap dyMap = new HashMap<>(); + HashMap lineMap = new HashMap<>(); + HashMap towerMap = new HashMap<>(); + HashMap terminalMap = new HashMap<>(); + // 做map + for (DyLevel dy : dyList) { + dyMap.put(dy.getId(), dy); + } + for (Lines line : lineList) { + lineMap.put(line.getId(), line); + } + for (Towers tower : towerList) { + towerMap.put(tower.getId(), tower); + } + for (Terminals terminal : terminalList) { + terminalMap.put(terminal.getId(), terminal); + } + + // 一层挂上一层 + for (Terminals terminal : terminalList) { + Integer towerId = terminal.getTowerId(); + if (towerId != null) { + Towers tower = towerMap.get(towerId); + if (tower != null) { + tower.getList().add(terminal); + } + } + } + for (Towers tower : towerList) { + Integer lineId = tower.getLineid(); + if (lineId != null) { + Lines line = lineMap.get(lineId); + if (line != null) { + line.getList().add(tower); + } + } + } + for (Lines line : lineList) { + Integer dyLevelId = line.getDyLevelId(); + if (dyLevelId != null) { + DyLevel dyLevel = dyMap.get(dyLevelId); + if (dyLevel != null) { + dyLevel.getList().add(line); + } + } + } + } + return dyList; + } + +} diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/PermissionServiceImpl.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/PermissionServiceImpl.java index 616b64a..e430eec 100644 --- a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/PermissionServiceImpl.java +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/PermissionServiceImpl.java @@ -7,6 +7,7 @@ import com.shxy.xymanager_common.enums.PermissionDetailEnum; import com.shxy.xymanager_dao.dao.*; import com.shxy.xymanager_service.service.PermissionService; import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -58,6 +59,7 @@ public class PermissionServiceImpl implements PermissionService { } @Override + @CacheEvict(value = "permission_byuser", key = "#userId") public void changePermission(Integer userId, List list) throws Exception { TbPermissionExample example = new TbPermissionExample(); TbPermissionExample.Criteria criteria = example.createCriteria(); diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/RoleServiceImpl.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/RoleServiceImpl.java index 82c13eb..204d04c 100644 --- a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/RoleServiceImpl.java +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/RoleServiceImpl.java @@ -1,21 +1,15 @@ package com.shxy.xymanager_service.impl; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollectionUtil; -import com.shxy.xymanager_common.bean.ServiceBody; import com.shxy.xymanager_common.entity.*; import com.shxy.xymanager_common.exception.ApiException; -import com.shxy.xymanager_common.exception.Asserts; import com.shxy.xymanager_dao.dao.*; import com.shxy.xymanager_service.service.RoleService; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Date; -import java.util.HashMap; import java.util.List; import static com.shxy.xymanager_common.constant.Constants.SUPER_ADMIN; @@ -29,17 +23,6 @@ public class RoleServiceImpl implements RoleService { @Resource TbRoleMapper roleMapper; - @Autowired - DyLevelDao dyLevelDao; - - @Autowired - LinesDao linesDao; - - @Autowired - TowerDao towerDao; - - @Autowired - TerminalsDao terminalsDao; @Override public List listAll() { @@ -97,61 +80,4 @@ public class RoleServiceImpl implements RoleService { roleMapper.deleteByPrimaryKey(id); } - /* - * - * 查询权限树状列表 - * */ - @Override - public ServiceBody> getPermissionTree() { - List dyLevels = dyLevelDao.selectByExample(new DyLevelExample()); - List lines = linesDao.selectByExample(new LinesExample()); - List towers = towerDao.selectByExample(new TowersExample()); - List terminals = terminalsDao.selectByExample(new TerminalsExample()); - if (CollectionUtil.isNotEmpty(dyLevels)) { - HashMap dymap = new HashMap<>(); - HashMap linemap = new HashMap<>(); - HashMap towermap = new HashMap<>(); - HashMap termmap = new HashMap<>(); - for (DyLevel ditem : dyLevels) { - dymap.put(ditem.getId(), ditem); - } - for (Lines litem : lines) { - linemap.put(litem.getId(), litem); - } - for (Towers titem : towers) { - towermap.put(titem.getId(), titem); - } - for (Terminals termitem : terminals) { - termmap.put(termitem.getId(), termitem); - } - for (Terminals termitem : terminals) { - Integer towerid = termitem.getTowerId(); - if (towerid != null) { - Towers towers1 = towermap.get(towerid); - if (BeanUtil.isNotEmpty(towers1)) { - towers1.getList().add(termitem); - } - } - } - for (Towers titem : towers) { - Integer lineId = titem.getLineid(); - if (lineId != null) { - Lines lines1 = linemap.get(lineId); - if (BeanUtil.isNotEmpty(lines1)) { - lines1.getList().add(titem); - } - } - } - for (Lines litem : lines) { - Integer dyLevelId = litem.getDyLevelId(); - if (dyLevelId != null) { - DyLevel dyLevel = dymap.get(dyLevelId); - if (BeanUtil.isNotEmpty(dyLevel)) { - dyLevel.getList().add(litem); - } - } - } - } - return Asserts.success(dyLevels); - } } diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TerminalServiceImpl.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TerminalServiceImpl.java index 48c5cd0..1dc6066 100644 --- a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TerminalServiceImpl.java +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TerminalServiceImpl.java @@ -32,6 +32,7 @@ import com.shxy.xymanager_service.service.TerminalService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -223,6 +224,7 @@ public class TerminalServiceImpl implements TerminalService { * @return */ @Override + @CacheEvict(value = "fulltree") public ServiceBody addTerminal(TerminalVo vo) { String cmdId = vo.getCmdid(); Terminals terminals = new Terminals(); @@ -268,6 +270,7 @@ public class TerminalServiceImpl implements TerminalService { * @return */ @Override + @CacheEvict(value = "fulltree") public ServiceBody updateTerminal(UpdateTerminalVo vo) { Integer termid = vo.getId(); List channelId = vo.getList(); @@ -308,6 +311,7 @@ public class TerminalServiceImpl implements TerminalService { * @return */ @Override + @CacheEvict(value = "fulltree") public ServiceBody deleteTerminal(TerminalIdListVo vo) { List list = vo.getList(); if (CollectionUtil.isEmpty(list)) { @@ -394,6 +398,7 @@ public class TerminalServiceImpl implements TerminalService { } @Override + @CacheEvict(value = "fulltree") public ServiceBody updateTerminalId(TerminalIdUpdateVo vo) { TerminalUpdateModel model = new TerminalUpdateModel(); Integer termId = vo.getTermId(); diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TowerServiceImpl.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TowerServiceImpl.java index f01dd9b..74d3621 100644 --- a/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TowerServiceImpl.java +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/impl/TowerServiceImpl.java @@ -22,6 +22,7 @@ import com.shxy.xymanager_service.service.CacheService; import com.shxy.xymanager_service.service.TowerService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -45,6 +46,7 @@ public class TowerServiceImpl implements TowerService { private CacheService cacheService; @Override + @CacheEvict(value = "fulltree") public ServiceBody addTower(TowersVo vo) { List towersLst = BeanUtil.copyToList(vo.getList(), Towers.class, CopyOptions.create().ignoreCase()); Date date = new Date(); @@ -91,6 +93,7 @@ public class TowerServiceImpl implements TowerService { } @Override + @CacheEvict(value = "fulltree") public ServiceBody deleteTower(TowerIdVo vo) { List list = vo.getList(); if (CollectionUtil.isEmpty(list)) { @@ -109,6 +112,7 @@ public class TowerServiceImpl implements TowerService { } @Override + @CacheEvict(value = "fulltree") public ServiceBody updateTower(UpdateTowerVo vo) { Towers towers = new Towers(); towers.setId(vo.getId()); diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/service/NewCacheService.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/NewCacheService.java new file mode 100644 index 0000000..38fd67a --- /dev/null +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/NewCacheService.java @@ -0,0 +1,14 @@ +package com.shxy.xymanager_service.service; + + +import com.shxy.xymanager_common.bean.PermissionDetail; +import com.shxy.xymanager_common.entity.DyLevel; + +import java.util.List; + +public interface NewCacheService { + + PermissionDetail getIncludeDetail(Integer userId); + + List getFullTree(); +} diff --git a/xymanager_service/src/main/java/com/shxy/xymanager_service/service/RoleService.java b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/RoleService.java index 687bc0b..8be2cee 100644 --- a/xymanager_service/src/main/java/com/shxy/xymanager_service/service/RoleService.java +++ b/xymanager_service/src/main/java/com/shxy/xymanager_service/service/RoleService.java @@ -1,7 +1,5 @@ package com.shxy.xymanager_service.service; -import com.shxy.xymanager_common.bean.ServiceBody; -import com.shxy.xymanager_common.entity.DyLevel; import com.shxy.xymanager_common.entity.TbRole; import java.util.List; @@ -16,6 +14,4 @@ public interface RoleService { void delete(Integer id) throws Exception; - ServiceBody> getPermissionTree() ; - }