
# 业务背景
### 诉求:
期望按照特定规则隐藏左侧菜单项
### 痛点分析:
通常情况下,我们是通过配置单据权限来实现菜单的显隐。但是这样会遇到几个问题:
1. 针对全员应用不验权的单据,虽然我们也有方法配置全员应用指定单据验权功能,但是配置麻烦;
2. 只有实体才可以配置权限,有些菜单并非实体表单,所以在权限配置界面选不到;
3. 有些场景下,需要限制普通用户对各功能模块的基础资料的修改,那么在权限配置的时候,需要去各个云节点下授权,工作量太大
# 效果预览
1. 开发平台菜单配置情况:

2. 页面原始显示效果如图:

3. 最终想要实现的效果:隐藏【测试单据一】

# 实现步骤
1. 访问路径:【开发服务云】--【扩展平台】--【业务扩展点】--【业务扩展场景】
2. 搜索编码BOS_SVC_PORTAL_MENU_PERM,如图:

3. 点击【绑定插件】按钮,然后在详情页注册我们自己写的插件,如图:

4. 插件代码如下:
```
package kd.hr.hrt.dada.demo.LicenseCheck;
import kd.bos.algo.DataSet;
import kd.bos.algo.Row;
import kd.bos.db.DB;
import kd.bos.db.DBRoute;
import kd.bos.portal.service.IPortalAppMenuExtService;
import java.util.*;
public class PortalAppMenuExtDemoservice implements IPortalAppMenuExtService {
@Override
public Map<String, Set<String>> getHideMenuIdsByBizAppIds(Long userId, Map<String, Set<String>> appIdAndMenuIdMap) {
Map<String, Set<String>> map = new HashMap<>();
//获取对应表单挂载的应用下的菜单id列表;
String sql = "select fid from t_meta_menuruntime tmm where fformid = ?";
Object[] params = new Object[]{"testone"};
DataSet dataSet = DB.queryDataSet(this.getClass().getName(), DBRoute.meta, sql, params);
List<String> idList = new ArrayList<>();
for (Row row : dataSet) {
idList.add((String) row.get("fid"));
}
for (Map.Entry<String, Set<String>> stringSetEntry : appIdAndMenuIdMap.entrySet()) { //appIdAndMenuIdMap的key就是appId,value是一个set,存储的就是对应菜单的id
Set<String> hideMenus = new HashSet<>(); //初始化一个set,用来存储需要隐藏的菜单id
Iterator iterator = stringSetEntry.getValue().iterator();
while (iterator.hasNext()) {
String str = (String) iterator.next();
if (idList.contains(str)) { //遍历当前应用下的菜单,判断菜单id是否是所要隐藏的表单的菜单id,如果是,则要将该菜单id加入hideMenus中
hideMenus.add(str);
}
}
map.put(stringSetEntry.getKey(), hideMenus);
}
return map;
}
}
```
# 功能影响范围
- 快速发起
- 统计卡片
- 我的收藏
- 最近使用
- 应用首页左侧菜单
- 新门户应用中心的应用菜单
- 新版菜单搜索
- 首页右上角旧版搜索