
# 关键词:单点登录、页面集成、页面跳转、应用菜单点击、门户应用页签
# 一、需求
在许多业务场景中,由于客户已有系统在长期稳定使用,或功能页面在苍穹上重构代价巨大等因素,需要将现有系统中的功能页面直接嵌入到苍穹中以供业务平滑使用,故涉及到一个非常常见的业务场景:苍穹与第三方系统进行页面集成。用户登录苍穹之后,点击某应用的指定菜单,系统自动单点登录第三方系统并在
**门户应用页签层** 打开指定页面,然后用户可自由进行业务操作。
# 二、思路与方案
该业务场景(在苍穹门户应用页签层打开第三方系统页面),与知识 [苍穹应用菜单触发 | 在新浏览器窗口打开第三方带会话信息页面](https://vip.kingdee.com/article/520242273347538432?productLineId=29&isKnowledge=1) 基本一致,只不过后者是通过 getView().openUrl(String) 在新浏览器窗口中打开。此外,用户登录苍穹后,在门户首页点击应用卡片,系统默认是在门户应用页签层打开应用首页。
基于此,本案例的实现可通过将第三方系统页面嵌入至另一个应用的首页,然后利用平台接口 OpenPageUtils.openApp 打开该新应用即可。
# 三、实现过程
## 3.1 准备工作
苍穹系统:http://172.20.14.30:8080/ierp
第三方系统:本案例以另一套苍穹环境进行模拟,其访问地址:http://172.20.240.88:8080/ierp
统一身份认证服务系统:https://api.kingdee.com
## 3.2 注册应用
与 [苍穹应用菜单触发 | 在新浏览器窗口打开第三方带会话信息页面](https://vip.kingdee.com/article/520242273347538432?productLineId=29&isKnowledge=1) $3.2 节一致,请自行查阅原文内容。
## 3.3 在苍穹系统中开发单点登录金蝶云平台插件(CldPlatformSSOPlugin)
与知识 [苍穹应用菜单触发 | 在新浏览器窗口打开第三方带会话信息页面](https://vip.kingdee.com/article/520242273347538432?productLineId=29&isKnowledge=1) $3.3 节一致,请自行查阅原文内容。
## 3.4 配置应用菜单(ToTrdSysPageFormPlugin)
与知识 [苍穹应用菜单触发 | 在新浏览器窗口打开第三方带会话信息页面](https://vip.kingdee.com/article/520242273347538432?productLineId=29&isKnowledge=1) $3.4 节一致,请自行查阅原文内容。
## 3.5 在应用首页上注册插件二开干预应用菜单的点击事件(CustomBizAppHomePlugin2)
```language
@Override
public void treeMenuClick(TreeNodeEvent evt) {
// 点击指定菜单跳转第三方系统页面
Object appMenuNodeId = evt.getNodeId();
AppMenuInfo appMenuInfo = AppMetadataCache.getAppMenuInfo(KEY_APPNUMER, appMenuNodeId.toString());
if (appMenuInfo != null) {
if (StringUtils.equalsIgnoreCase("kdec_totrdpagebyappmenu", appMenuInfo.getFormId())) {
// 在门户应用层页签打开第三方系统页面
this.gotoApp("kdec_tstapp3", "第三方系统应用");
}
}
}
```
## 3.6 在门户应用页签层打开第三方系统页面(CustomBizAppHomePlugin2)
*备注:
1.可将第三方系统页面嵌套在新应用的首页中(即下一节 $3.7 内容),然后通过打开新应用实现在门户应用页签层打开第三方系统页面。
2.在门户应用页签层打开第三方系统页面,建议通过平台接口 OpenPageUtils.openApp 打开,若通过 getView().showForm(FormShowParameter) 则会存在重复打开应用页签等问题。*
```language
/**
* 点击指定菜单单点登录第三方系统并在门户应用层页签打开页面. 根据实际业务修改
*/
private void gotoApp(String appNum, String custAppCaption) {
// 在门户应用层页签打开第三方系统页面
OpenTrdPageUtils.openTrdSysPageWithNewTabPage(getView(), "kdec_tstapp3", "第三方系统应用");
}
```
## 3.7 将第三方系统页面嵌入【测试应用3/kdec_tstapp3】的应用首页(TrdSysPageFormPlugin)
### 1.新建空白应用【测试应用3/kdec_tstapp3】,在其应用首页上预置 IFrame 控件,并不显示其它所有控件,其设计器界面如图所示
*备注:
页面不需要显示的控件,有 2 种处理方案:
① 将其业务属性"可见性"中的"初始可见"去掉;
② 开启业务属性"隐藏元素"。
此处采用第 ① 种方案,将图中控件Flex面板"可见性"中的"初始可见"移除。*

### 2.在该应用的首页上注册插件展示第三方系统页面(TrdSysPageFormPlugin)
```language
@Override
public void afterBindData(EventObject evt) {
String trdSysTargetUrl = null;
try {
trdSysTargetUrl = OpenTrdPageUtils.getTrdSysTargetUrl(false);
} catch (Exception e) {
this.getView().showMessage(e.getMessage());
}
// 为IFrame控件设置URL
IFrame iFrame = this.getView().getControl(KEY_IFRAME_TRDSYSPAGE);
if (StringUtils.isNotEmpty(trdSysTargetUrl)) {
iFrame.setSrc(trdSysTargetUrl);
}
super.after