A8接口和增值开发手册 -

更新时间:2023-10-23 14:36:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

A8平台接口和增值开发手册

? 2006 UF Seeyon Co., Ltd. All rights reserved.

This document contains information that is proprietary and confidential to UF Seeyon., which shall not be

disclosed outside the recipient's company or duplicated, used or disclosed in whole or in part by the recipient for any purpose other than to evaluate this file. Any other use or disclosure in whole or in part of this information without the express written permission of UF Seeyon. is prohibited.

Date: 2009-01-04 Author: Version:

王文友 V1.0

用友致远协同办公系统-开发手册

修改记录 .............................................................................................. 3 1. 概述 ............................................................................................... 4 1.1 编写目的 ................................................................................... 4 1.2 开发背景 ................................................................................... 4 1.3 应用价值 ................................................................................... 4 1.4 接口范围 ................................................................................... 5 2. 二次开发接口 .................................................................................... 6 2.1 接口一览 ................................................................................... 6 2.2 服务列表 ................................................................................... 6 3. Portal集成 ..................................................................................... 7

3.1 单点登录(SSO) ............................................................................ 7

3.1.1 外部平台集成A8 ........................................................................................... 7

3.1.1.1 实现说明 ............................................................................................ 7 3.1.1.2 接口说明 ............................................................................................ 7 3.1.1.3 代码示例 ............................................................................................ 8 3.1.1.4 部署说明 ............................................................................................ 9 3.1.2 A8集成第三方系统 ........................................................................................ 9

3.1.2.1 实现方式一:Ticket ............................................................................... 9 3.1.2.2 实现方式二:关联系统+扩展栏目 ............................................................... 11 3.2 Portlet ................................................................................... 13 3.2.1 概述 ......................................................................................................... 13 3.2.2 开发说明 ................................................................................................... 13

3.2.2.1 确定栏目数据 ...................................................................................... 13 3.2.2.2 确定栏目显示模板 ................................................................................ 13 3.2.2.3 开发说明 ........................................................................................... 14 3.2.2.4 注册到系统 ......................................................................................... 14 3.2.3 代码示例 ................................................................................................... 15 3.2.4 待办事项和跟踪事项 ...................................................................................... 21 3.2.5 新闻和公告 ................................................................................................. 21

4. 消息集成 ....................................................................................... 22 4.1 消息通道 ................................................................................. 22

4.1.1 概述 ......................................................................................................... 22 4.1.2 接口说明 ................................................................................................... 22

4.1.2.1 方法说明 ........................................................................................... 22 4.1.2.2 注册到系统 ......................................................................................... 22 4.1.2.3 原理说明 ........................................................................................... 23 4.1.3 代码示例 ................................................................................................... 23 4.2 短信接口 ................................................................................. 24 4.2.1 概述 ......................................................................................................... 24 4.2.2 接口说明 ................................................................................................... 24

4.2.2.1 注册到系统 ......................................................................................... 26 4.2.2.2 原理说明 ........................................................................................... 27 4.2.3 代码示例 ................................................................................................... 28

5. 组织模型同步 .................................................................................. 29 5.1 初始化同步............................................................................... 29

5.1.1 导出 ......................................................................................................... 29 5.1.2 导入 ......................................................................................................... 30

5.2 实时同步 ................................................................................. 30 5.2.1 实现A8组织模型事件监听接口 ......................................................................... 30 5.2.2 注册事件监听 .............................................................................................. 36

6. BPM集成...................................................................................... 36 6.1 准备 ....................................................................................... 37 6.2 外部系统发起A8表单流程 ............................................................ 38 6.3 轮询完成的表单流程 .................................................................... 38 6.4 导出A8表单流程到外部系统 ......................................................... 38 7. 附录 ............................................................................................. 38 7.1 术语表 .................................................................................... 38

用友致远协同办公系统-开发手册

修改记录

日期 2008-12-08 2008-12-15 2008-12-23 2008-12-29 2009-01-04 2009-06-16 2009-9-27 修改人 王文友 王文友 王文友 王文友 王文友 张勇 王文友 修改内容 创建文档,编写文档模板。 增加了安装服务文档。 增加了文档导出接口例程。 备注 合并刘娜组织模型文档,加入例程; 合并于荒津BPM文档。 合并张勇Portal和消息文档,拆分API文档。 增加单点登录不打开页面方式说明和待办事项接口说明 增加组织模型同步和BPM集成 用友致远协同办公系统-开发手册

1. 概述

1.1 编写目的

本手册主要面向二次开发人员,内容涵盖A8平台的二次开发、第三方应用集成。如果需要更详细的开发信息,请参考《平台API参考手册》。 1.2 开发背景

接口的目标是

1、 与第三方应用集成,达成松散耦合,紧密集成的目标; 2、 与异构应用集成;

3、 降低二次开发的技术难度;

4、 规范化二次开发,提升二次开发的稳定性;

5、 保证二次开发的延续性,降低二次开发应用升级难度。 1.3 应用价值

目前平台开放的接口支持: 1、 组织模型同步

使用组织模型导入接口,实现外部系统到A8的组织模型初始化同步;

调用组织模型管理远程接口,在外部系统组织模型发生变化时实时同步到A8。 实现组织模型事件接口,将A8组织模型变更实时同步到外部系统。

2、 表单流程集成

外部系统通过BPM集成远程接口发起A8的表单流程,在A8中审批流转后回到外部系统,实现表单流程的打通。

3、 文档导出

使用文档导出SDK,将A8的协同、公文、新闻、公告、调查和讨论导出到外部系统,满足数据交换和归档的需求。

4、 Portal集成

A8 Portal可以集成外部系统的页面,也可以将A8集成到第三方Portal中,并且实现单点登录。

5、 消息集成

外部通过消息通道,实时获取A8中的消息。可以将A8的消息以邮件、IM(如GKE、RTX)消息和短信形式发送。

外部系统通过消息接口向A8指定用户发送消息。

6、 待办事项集成

外部系统通过待办事项接口,可以得到A8待办事项的列表,并且可以处理待办事项。

用友致远协同办公系统-开发手册

1.4 接口范围

A8协同办公平台采用Java开发,支持Oracle、mysql和Sql Server数据库。 平台提供了以下接口: 1、 二次开发接口:

提供本地开发的Java SDK和Web Service远程接口,涵盖组织模型同步与导入导出、文档导出、表单与流程集成、新闻与公告发布支持。

2、 Portal接口:

提供页面集成和单点登录接口,实现外部应用在A8-Portal的集中展现。

3、 消息(短信)接口:

提供外部系统获得A8协同办公平台消息的机制。除标准化产品提供的短信集成支持外,A8还提供了短信二次开发接口,支持与特定的短信运营平台集成。

用友致远协同办公系统-开发手册

2. 二次开发接口

预备知识:

1、 Web Service 2、 XML

3、 支持Web Service调用的编程语言

其中Java已验证,C#、Php未经验证,请参照Java例程及axis2文档进行开发。

A8平台接口提供基于axis2 1.4实现的标准Web service。可以采取多种方式进行客户端开发。

本指南所有远程接口例程使用axis2的ADB(Axis2 DataBinding Framework)stub方式进行开发。 为便于二次开发,在client/demo目录中提供了一个示例应用,示例包括以下内容: 单点登录、组织模型同步、组织模型导出、公告新闻导出、文档导出、表单流程查询、BPM集成、消息集成、Portlet栏目集成 2.1 接口一览

? 组织模型接口:提供组织模型导入和导出接口,可以实现其他HR与A8的集成,其他系统可以与A8实现组

织模型和人员信息同步。

? 文档接口:提供了A8文档导出接口,支持协同、公文、新闻、公告等信息导出,通过此接口可以实现与档案

软件的集成,以及A8信息发布到外部网站。

? 表单流程接口:提供了外部数据导入A8进行流转审批,以及A8流程审批信息导出到其他系统(如ERP),通

过此接口可以实现政府外网审批信息提交到内网进行流转审批,ERP数据可以转入A8进行流转,A8流程审批信息也可以转入ERP进行结果管理。

? 新闻和公告发布接口:提供了单位新闻和公告的发布。 ? 待办事项接口:提供A8待办事项列表。

2.2 服务列表

A8平台提供以下服务: 名称 验证服务 人员管理服务 部门管理服务 岗位管理服务 职务级别管理服务 单位管理服务 组织模型数据服务 文档导出服务 新闻公告发布服务 表单服务 服务 authorityService personService departmentService ocupationService otypeService accountService organizationDataService documentService documentService formService 说明 用户身份验证服务 人员的创建、修改、删除和启用/禁用。 部门的创建、修改、删除和启用/禁用。 岗位的创建、修改、删除和启用/禁用。 职务级别的创建、修改、删除和启用/禁用。 人员、部门、岗位和职务级别数据导入导出服务。 协同、公文、新闻、公告、讨论、调查数据导出服务。 新闻和公告发布发布服务。 表单定义与数据导出服务 用友致远协同办公系统-开发手册 BPM服务 事项服务 消息服务 文件服务 BPMService affairService messageService downloadService uploadService 业务单据流程集成服务。 待办事项和跟踪事项集成服务。 外部系统发消息到A8的服务。 A8的附件下载和上传服务。 服务详情参见《平台API参考手册》。

3. Portal集成

3.1 单点登录(SSO) 3.1.1 外部平台集成A8 3.1.1.1 实现说明

也就是从外部系统登录到A8,这种认证是完全信任外部系统的。 单点登录有2种效果:

1, 单点登录成功后直接打开A8主页面 2, 单点登录成功后并不打开A8主页面,A8维护ticket信息和登录用户信息,为以后请求服务作认证使用,比如:

请求获得A8待办事项列表服务。需要配置SSOLoginContext.xml中一个属性如下:

登录过程:

? 人员登录外部平台

? 外部平台带着ticket和from跳转到A8-/login/sso?from=*&ticket=*

1. 如果A8登录正常,会在response header中增加SSOOK,否则增加SSOError 例如:

\+encodeURIComponent(\<%=request.getParameter(\t\)%>\)+\;

? A8根据from取得握手bean ,也就是springBean id 例如:

? ? ? ? ? ? 调用握手bean由外部系统认证ticket并返回A8的登录名 把ticket和username维护在内存

A8带着ticket跳转到/login/proxy ,也就是执行一个servlet A8 JAAS的取得用户身份信息

A8退出时,会通过SSOLoginHandshakeInterface的logoutNotify()通知到外部系统 外部系统退出时,访问A8 /login/ssologout?from=*&ticket=*通知A8

3.1.1.2 接口说明

? 外部平台需要有A8登录名的映射表或者使用相同的登录名

用友致远协同办公系统-开发手册

? JAAS的DefaultLoginModule验证用户名(不验证密码)

? SSOLoginHandshakeInterface与from映射,需要配置或二次开发,系统提供通用的SSOLoginHandshakeServletImpl

? A8的验证系统完全依赖和信任外部系统(存在风险)

1、 配置文件:

ApacheJetspeed2\\webapps\\ROOT\\WEB-INF\\classes\\SSOLoginContext.xml(如无可自己创建)

2、 实现接口SSOLoginHandshakeInterface的handshake方法 /**

* 通过握手获取平台的认证信息

* @param token 平台传过来的令牌信息 * @return 返回当前登录者的登录名 */

public String handshake(String token);

3.1.1.3 代码示例 从GKE登录到A8: public class GKEA8SSOLoginImp implements SSOLoginHandshakeInterface { private static final Log log = LogFactory.getLog(GKEA8SSOLoginImp.class); private static final int gkeTimeOut=60000; // “token” 就是ticket取得的参数值 public String handshake(String token) { if(token==null||token.equals(\)) { return null; } String userName=\; 用友致远协同办公系统-开发手册

String[] r=token.split(\); if(r==null||r.length!=2) {

return null; }

userName=this.checkPassport(r[0], r[1]); return userName; }

private String checkPassport(String GID,String passPort ) {

StringBuffer sb = new StringBuffer();

sb.append(\);

sb.append(\); sb.append(\); sb.append(\);

sb.append(\+GID+\ gid=\\\ zoneid=\\\); sb.append(\); sb.append(passPort); sb.append(\); sb.append(\); sb.append(\); sb.append(\);

return getGKEResponse(postGKERequest(sb.toString())); }

3.1.1.4 部署说明

单点登录的开发建立的java文件放在org.apache.jetspeed.login包下 例如:

package com.seeyon.v3x.login.gke;

注意事项:

Java的编译class文件,SSOLoginContext.xml 文件,jsp文件copy到SeeyonA8/webapps/ROOT下

3.1.2 A8集成第三方系统 3.1.2.1 实现方式一:Ticket 实现步骤: 1. 添加页签

按下面的定义,在A8的webapps/seeyon/WEB-INF/classes目录下新建一个XML文件,如myspace.xml

用友致远协同办公系统-开发手册

修改webapps/seeyon/WEB-INF/web.xml,增加对新增的myspace.xml的引用

注意事项:集成第三方系统,要以A8系统插件定义

在webapps\\seeyon\\WEB-INF\\classes\\conf\\plugin下新建一个内容如下的XML,即可定义一个id为news,名称为“新闻插件”的新的插件

用友致远协同办公系统-开发手册 classpath*:a.xml 2. 配置第三方系统

ThirdpartySpace:名称、登录地址、页面地址、打开方式、访问权限、能访问的系统角色 3. 登录过程

o 在A8中点击\空间页签\

o A8产生Ticket,并维护在内存中

o A8带着Ticket访问第三方系统的\登录地址\(loginURL)进行握手

第三方系统根据Ticket回调获取A8身份信息,进行单点登录,并注册Ticket和登录用户的映射 o A8带着Ticket跳转到第三方系统的\页面地址\(pageURL)

4. 说明

o 第三方系统完全依赖和信任A8的身份验证,Ticket由A8发放 o 第三方系统使用与A8完全相同的登录名

或者进行二次开发,自己维护A8登录名与第三方系统用户的映射表。

o 如果当前用户已经登录第三方系统,将跳过② ③,直接到第4步,使用相同的Ticket

1. 认证ticket/获取身份信息的接口系统提供Servlet:

http://a8:80/seeyon/thirdparty.do?ticket=**;A8将通过response header的LoginName返回登录名; 2. 如果第三方回调后认为有异常,请在response header增加名称为SSOLogoutError的信息。

o 第三方系统退出时,要通知A8,地址是

http://a8:80/seeyon/thirdparty.do?method=logoutNotify&ticket=** o 根据情况可将 ③ ④步合并 (省略loginURL)

3.1.2.2 实现方式二:关联系统+扩展栏目

无需开发,使用关联系统管理登录信息,集成外部系统页面。 1、 配置关联系统

以系统管理员system登录A8,使用“关联系统管理”建立一个新的关联系统。关联系统的url为被集成系统的登录链接,将登录需要的信息如用户名和密码定义为关联系统参数。

用友致远协同办公系统-开发手册

2、 建立扩展栏目

由外部系统管理验证信息的栏目有两种:数据集成型栏目(SSOWebContentSection)和功能操作型栏目(SSOIframeSection)。

3、 用户登录后,在个人空间中配置关联系统参数,填写集成系统的登录信息(用户名和密码)。由关联系统维护

被集成系统的用户名、密码以及Session。

用友致远协同办公系统-开发手册

4、 说明

被集成系统的修改:登录不成功,需要在登录请求的response中增加header项:LoginError=***,否则A8无法判断是否成功登录。 3.2 Portlet 3.2.1 概述

Portlet在A8中的概念是首页空间中的一个区域,它包含多个Tab(栏目)。Portlet的开发也就是对Tab栏目的开发

3.2.2 开发说明 3.2.2.1 确定栏目数据

栏目中的数据由首页应用来确定

需要提供的接口:在应用中专为首页提供数据抽取的接口或方法,一般有2个: 1. 数据列表抽取,需要做好按量抽取 2. 数据总数统计 3.2.2.2 确定栏目显示模板

现在栏目显示模板提供了以下几种 (不断扩充中)

1. MultiRowFourColumnTemplete 重复行、4列

? 4列依次是subject、createDate、createMemberName、category

用友致远协同办公系统-开发手册

? 链接:subject、category分别都有链接

? 扩展属性:importantLevel、hasAttachments、bodyType、extIcons

2. MultiRowThreeColumnTemplete重复行、3列

? 3列依次是subject、createDate、category ? 链接:subject、category分别都有链接

? 扩展属性:importantLevel、hasAttachments、bodyType、extIcons

3. ChessboardTemplete 棋盘式

? 每个项目的属性有:icon、name、link

? setLayout(row,colum) 设置行数跟列数 4. HTMLTemplete HTML的输出模式

? Model属性:

1,直接输出,采用innerHTML方式 2,采用内嵌模式

? Html属性:html代码 3.2.2.3 开发说明

包名: com.seeyon.v3x.main.section 命名规范:***Section

其它:必须继承BaseSection

需要实现的方法

1、 getId()

栏目的唯一标识,同时也是Spring Bean定义的Id, 在ajax.xml中需要配置该bean; 直接返回一个有字符+数字组成的字符串,如:pendingSection 2、 getName()

栏目名称的国际化key,需要在资源文件/apps_res/v3xmain/js/i18n下定义 3、 getIcon()

栏目图标,统一放在 /apps_res/v3xmain/images/section下,如 /apps_res/v3xmain/images/section/pending.col.gif 4、 getTotal()

总数,如果不需要显示总数,就返回null

5、 projection()

在这里取得数据,并在显示模板中填充数据 底部链接:

1、 接口templete.addBottomButton(label, link); 2、 通用按钮label

a) 更多 BaseSectionTemplete.BOTTOM_BUTTON_LABEL_MORE

3.2.2.4 注册到系统

找到section.xml,配置spring: group, // 集团空间 custom, // 自定义空间 不设置表示不限制 2、初始化方法必须是init,否则不可用 personal ? 注意事项:bean的id必须和java类中getId()返回的值相同

执行sql脚本把portlet(Tab)添加到系统: 例如: INSERT INTO v3x_portlet_entity_property VALUES(15, 30, 'sections', 'relateMemberSection,projectSection,newLinkSystemSection'); 在其后增加你的sectionid,用逗号分隔 3.2.3 代码示例 以待办事项为例:

例如:

public class PendingSection extends BaseSection { @Override public String getId() { return \; public void setOrgManager(OrgManager orgManager) { } this.orgManager = orgManager; public void setAffairManager(AffairManager affairManager) { } this.affairManager = affairManager; private static final Log log = LogFactory.getLog(PendingSection.class); private AffairManager affairManager; private OrgManager orgManager;

用友致远协同办公系统-开发手册

}

public String getName(Map preference) { }

@Override

public String getIcon() { }

@Override

public Integer getTotal(Map preference) {

User user = CurrentUser.get(); Long memberId = user.getId();

List _agentModelList = MemberAgentBean.getInstance()

.getAgentModelList(memberId); .getAgentModelToList(memberId);

List _agentModelToList = MemberAgentBean.getInstance() List agentModelList = null; boolean agentToFlag = false; boolean isPloxy = false;

if (_agentModelList != null && !_agentModelList.isEmpty()) { }

Map agentModelMap = new HashMap(); if (isPloxy) {

for (AgentModel agentModel : agentModelList) {

String agentOptionStr = agentModel.getAgentOption(); String[] agentOptions = agentOptionStr.split(\); for (String agentOption : agentOptions) {

int _agentOption = Integer.parseInt(agentOption);

if (_agentOption == ApplicationCategoryEnum.collaboration

.key()) {

.key(), agentModel);

agentModelMap.put(ApplicationCategoryEnum.collaboration

isPloxy = true;

agentModelList = _agentModelList; isPloxy = true;

agentModelList = _agentModelToList; agentToFlag = true; isPloxy = false; return null; return \;

} else if (_agentModelToList != null && !_agentModelToList.isEmpty()) {

} else {

} else if (_agentOption == ApplicationCategoryEnum.edoc

.key()) {

agentModel);

agentModelMap.put(ApplicationCategoryEnum.edoc.key(),

用友致远协同办公系统-开发手册

}

}

}

}

} else if (_agentOption == ApplicationCategoryEnum.meeting }

.key()) {

ApplicationCategoryEnum.meeting.key(), agentModel);

agentModelMap.put(

return affairManager.countPending(memberId, agentModelMap, null, null,

null, agentToFlag);

public BaseSectionTemplete projection(Map preference) {

MultiRowFourColumnTemplete c = new MultiRowFourColumnTemplete(); User user = CurrentUser.get(); Long memberId = user.getId(); Long proxyId = user.getAgentToId();

Pagination.setNeedCount(false); // 不需要分页 Pagination.setFirstResult(0); Pagination.setMaxResults(8); String url = \;

List _agentModelList = MemberAgentBean.getInstance()

.getAgentModelList(memberId); .getAgentModelToList(memberId);

List _agentModelToList = MemberAgentBean.getInstance() List agentModelList = null; boolean agentToFlag = false; boolean isPloxy = false;

if (_agentModelList != null && !_agentModelList.isEmpty()) { }

Map agentModelMap = new HashMap(); if (isPloxy) {

for (AgentModel agentModel : agentModelList) {

String agentOptionStr = agentModel.getAgentOption(); String[] agentOptions = agentOptionStr.split(\); isPloxy = true;

agentModelList = _agentModelList; isPloxy = true;

agentModelList = _agentModelToList; agentToFlag = true; isPloxy = false;

} else if (_agentModelToList != null && !_agentModelToList.isEmpty()) {

} else {

用友致远协同办公系统-开发手册

}

}

for (String agentOption : agentOptions) { }

int _agentOption = Integer.parseInt(agentOption);

if (_agentOption == ApplicationCategoryEnum.collaboration }

.key()) {

.key(), agentModel);

agentModelMap.put(ApplicationCategoryEnum.collaboration

} else if (_agentOption == ApplicationCategoryEnum.edoc

.key()) {

agentModel);

agentModelMap.put(ApplicationCategoryEnum.edoc.key(),

} else if (_agentOption == ApplicationCategoryEnum.meeting

.key()) {

ApplicationCategoryEnum.meeting.key(), agentModel);

agentModelMap.put(

List affairs = affairManager.queryPendingList(memberId,

agentModelMap, null, null, null, agentToFlag);

if (affairs == null) { }

for (Affair affair : affairs) {

url = \;

MultiRowFourColumnTemplete.Row row = c.addRow(); String forwardMember = affair.getForwardMember(); Integer resentTime = affair.getResentTime();

String subject = ColHelper.mergeSubjectWithForwardMembers(affair

.getSubject(), forwardMember, resentTime, orgManager, null);

int app = affair.getApp();

Long objectId = affair.getObjectId(); row.setSubject(subject);

ApplicationCategoryEnum appEnum = ApplicationCategoryEnum

.valueOf(app);

switch (appEnum) { case collaboration:

row

.setLink(\

+ affair.getId());

return null;

用友致远协同办公系统-开发手册

row

.setCategory(app,

\);

break; row

.setLink(\

+ objectId);

case meeting:

row.setCategory(app, \); break;

case edocSend: case edocRec: case edocSign:

row

.setLink(\

+ affair.getId());

row.setCategory(app, EdocUtil

.getEdocCategroryPendingUrl(appEnum.getKey()));

break; row }

row.setCategory(app, url); break; row }

row.setCategory(app, url); break; row.setLink(

+ EdocEnum.edocType.recEdoc.ordinal() + \ + affair.getSubObjectId()

+ affair.getSubObjectId());

.setLink(\

+ affair.getSubObjectId());

case exSend:

if (MenuFunction.hasMenu(EdocUtil.getMenuIdByApp(appEnum

.getKey()))) {

url = \;

case exSign:

.setLink(\

if (MenuFunction.hasMenu(EdocUtil.getMenuIdByApp(appEnum

.getKey()))) {

url = \;

case edocRegister:

\

用友致远协同办公系统-开发手册

} }

}

+ \ + affair.getObjectId(),

BaseSectionTemplete.OPEN_TYPE.href); .getKey()))) {

if (MenuFunction.hasMenu(EdocUtil.getMenuIdByApp(appEnum

url =

\;

row.setCategory(app, url); break;

row.setLink(\

+ affair.getObjectId(), OPEN_TYPE.openWorkSpaceRight);

boolean isGroup = (affair.getSubObjectId().intValue() ==

.ordinal());

\

+ (isGroup ? 0 : 1) + \ + (isGroup ? \ : \));

case bulletin:

com.seeyon.v3x.bulletin.util.Constants.BulTypeSpaceType.group

row.setCategory(app,

break;

row.setLink(\

+ affair.getObjectId(), OPEN_TYPE.openWorkSpaceRight);

boolean isGroupNews = (affair.getSubObjectId().intValue() ==

.ordinal());

\

+ (isGroupNews ? 0 : 1) + \ + (isGroupNews ? \ : \));

case news:

com.seeyon.v3x.news.util.Constants.NewsTypeSpaceType.group

row.setCategory(app,

break;

row.setLink(\

+ objectId, OPEN_TYPE.openWorkSpaceRight);

row.setCategory(app, \); break;

row.setLink(\

+ objectId, OPEN_TYPE.openWorkSpaceRight);

row.setCategory(app, \);

case inquiry:

case meetingroom: {

V3xOrgMember member = null; try {

用友致远协同办公系统-开发手册

}

}

}

}

member = orgManager.getMemberById(affair.getSenderId()); log.error(\, e);

} catch (BusinessException e) {

row.setCreateMemberName(member.getName());

row.setCreateMemberAlt(Functions.showMemberName(member)); row.setCreateDate(affair.getCreateDate()); if (proxyId.equals(affair.getMemberId())) { row.setAgent(true); // 代理 }

row.setBodyType(affair.getBodyType());

row.setImportantLevel(affair.getImportantLevel()); row.setHasAttachments(affair.isHasAttachments()); Boolean isOverTime = affair.getIsOvertopTime(); // 超期事件突出显示

row.setDistinct(isOverTime); if (isOverTime) { }

row.addExtIcons(\);

&& affair.getDeadlineDate() != 0) {

} else if (affair.getDeadlineDate() != null

row.addExtIcons(\);

if ((_agentModelToList != null && !_agentModelToList.isEmpty()) }

c.addBottomButton(BaseSectionTemplete.BOTTOM_BUTTON_LABEL_MORE,

\);

return c;

|| _agentModelList != null && !_agentModelList.isEmpty()) {

\);

c.addBottomButton(BaseSectionTemplete.BOTTOM_BUTTON_LABEL_AGENT,

3.2.4 待办事项和跟踪事项

调用affairService的exportPendingList和exportTrackList服务,获得用户的待办事项和跟踪事项的XML,解析后可以在外部系统进行展示。 3.2.5 新闻和公告

调用documentService的exportRecentNews和exportRecentAccountBulletin服务,获得指定单位的新闻和公告的XML,解析后可以在外部系统进行展示。

用友致远协同办公系统-开发手册

4. 消息集成

外部系统可以使用消息服务(参见《平台API参考手册》的消息服务)向A8用户发送消息,也可以通过消息通道接收A8的消息。 4.1 消息通道 4.1.1 概述

当需要开发消息集成,例如sms,email,rtx,gke,就可以使用此消息展现通道,只需要实现一个消息接口,A8系统就可以把外部的应用集成进来,在集成端可以收到A8的所有消息,如在线消息,协同,会议,计划等,在系统启动前和用户个人设置中均可以配置。

4.1.2 接口说明 4.1.2.1 方法说明

接口名称:interface MessagePipeline 需要实现的方法如下: 方法名称 getName() getShowName() isAvailability() isAllowSetting(User currentUser) 返回值 string string boolean string 说明 消息展现通道的系统标示,注意不要重复,有数字字母下划线构成,如:pc,sms,email,rtx,gke 消息展现通道的显示名称 该通道是否可用,可以控制是否需要消息展现 是否允许用户在“个人设置-消息提示设置”中进行配置; 如:短信提示,需要后台管理员授权,并且设置了个人的手机号码,人员是当前登录者,允许配置返回null,否则返回提示信息(注意国际化) getAllowSettingCategory() List 得到哪些应用类别可以配置(参考ApplicationCategoryEnum), 如果采用系统默认,请直接返回null 如果不允许配置请参考isAllowSetting(User currentUser) 在此方法中处理消息,把消息集成到外系统 排序号,从0开始 默认是否发送,如果为false,则个人需要在“个人设置-消息提示设置”中进行配置 invoke(Message[] messages) void getSortId() isDefaultSend() int boolean 4.1.2.2 注册到系统

系统启动时: [main] INFO MessagePipelineManagerImpl:68 - 加载消息展现通道:[pc, email] 用友致远协同办公系统-开发手册

代表加载成功

4.1.2.3 原理说明

Map messagePipelineMaps =

applicationContext.getBeansOfType(MessagePipeline.class); 通过getBeansOfType(),获得所有实现该接口的实例,加载到系统中 4.1.3 代码示例 以RTX消息展现为例:

public class RTXMessagePipeline implements MessagePipeline {

// 排序号

public int getSortId() { }

return 6;

// 默认是否发送

public boolean isDefaultSend() { }

return false;

// 消息展现通道的系统标示

public String getName() { }

return \;

// 该通道是否可用

public boolean isAvailability() { }

return SystemEnvironment.hasPlugin(\); }

}

} catch (Throwable e) { }

log.error(\, e);

// 处理消息

public void invoke(Message[] messages) {

for (Message message : messages) {

try {

String remoteURL = message.getRemoteURL();

String userName = message.getReceiverMember().getLoginName(); RTXNotifyValueBean value = new RTXNotifyValueBean(); String content = message.getContent();

value.title = message.getSenderMember().getName(); // ...

rtxSendNotifyManager.sendNotify(value);

用友致远协同办公系统-开发手册 } 4.2 短信接口 4.2.1 概述

二次开发时客户可能指定具体短信网关,这样我们需要支持此短信网关来发短信,可以只采用普通方式发短信息,实现A8普通短信接口即可,短信插件被启用时加载到系统。

例如:UFMOBILE,短信王

如果客户想使用消息回调,打开链接,必须开启移动应用插件,就是实现wappush接口的,必须开启移动应用插件,并且短信网关必须支持wap方式,只实现wap短信接口不能支持普通短信方式,

例如:中国移动CMPP3,金迪,分众

短信接口使用情况如下: 短信插件启用:

1,实现了“普通短信接口”,则系统启动时加载,

2,只实现了“支持wap方式接口”,并且移动应用插件未启用,则系统启动时不加载,

3,实现了“普通短信接口”,并且也实现了“支持wap方式接口”,并且移动应用插件未启用,则支持普通短信插件功能,不支持wap方式。 4.2.2 接口说明 接口名称:

interface AdapterMobileMessageManger 普通短信接口

interface AdapterMobileWapPushManager 支持wap方式接口,wappush url 不能为

空,即消息回调地址不能为空,如果同时实现了普通短信接口,则实现普通短信功能。 支持wap需要实现方法如下:

/**

* 检测Wappush适配器是否可用 */

public boolean isAvailability(); /**

* 短信网关的名称 */

public String getName(); /**

* 发送Wappush消息 * @param messageId * 消息的唯一标示 * @param srcPhone

* 短信的发送方手机号码 * @param destPhone

* 短信的接收方手机号码 * @param content * 短信内容

用友致远协同办公系统-开发手册

* @param wappushURL

* wap push的url,如果为null,说明不发送wappush,采用普通短信 * @return true 发送成功 */

public boolean sendMessage(int messageId, String srcPhone, String destPhone, String content, /**

* 发送Wappush消息 * @param messageId * 消息的唯一标示 * @param srcPhone

* 短信的发送方手机号码 * @param destPhone

* 短信的接收方手机号码 * @param content * 短信内容 * @param wappushURL

* wap push的url,如果为null,说明不发送wappush,如果同时实现了 * @return true 发送成功 */

public boolean sendMessage(int messageId, String srcPhone, Collection destPhone, /**

* 是否支持群发 *

* @return true 支持 */

public boolean isSupportQueueSend();

String content, String wappushURL);

String wappushURL);

AdapterMobileMessageManger 采用普通短信

采用普通方式: /** * 检测短信适配器是否可用 * @return */ public boolean isAvailability(); /** * 短信网关名称 * @return */ public String getName(); /** * 发送短消息 * * @param messageId

用友致远协同办公系统-开发手册

}

/**

* 更新岗位事件。 *

* @param oldPost

* 更新前的岗位对象。 * @param newPost

* 更新后的岗位对象。 */

void updatePost(Object oldPost, Object newPost) throws OrganizationEventException; /**

* 更新人员事件。 *

* @param oldMember

* 更新前的人员对象。 * @param newMember * 更新后的人员对象。 */

void updateMember(Object oldMember, Object newMember) throws OrganizationEventException; * 更新职位级别事件。 *

* @param oldLevel

* 更新前的职位级别对象。 * @param newLevel

* 更新后的职位级别对象。 */

void updateLevel(Object oldLevel, Object newLevel) throws OrganizationEventException;

在相应的事件方法中编写代码,将A8对部门、人员、岗位和职务级别的新建、更新、删除和启用(停用)同步到外部系统。

5.2.2 注册事件监听

开发一个A8插件,在插件初始化时,调用下面的代码,将实现的事件监听注册到A8。

OrganizationEventComposite.getInstance().addHandler(myListener); 6. BPM集成

使用A8的表单流程进行外部系统的单据流转,流程结束后将数据返回给外部系统。

用友致远协同办公系统-开发手册

6.1 准备

表单管理员登录A8,进入表单应用-表单制作,在应用绑定-表单模板修改指定外部系统调用的模板编号。如下图所示,A00001就是BPM集成接口中使用的templateCode参数的值。

用友致远协同办公系统-开发手册

6.2 外部系统发起A8表单流程

1. 准备数据。按照getTemplateDefinition返回的XML格式准备表单数据。

2. 按照定义的外部系统模板编号,调用BPMService的launchFormCollaboration服务发起A8表单流程。 3. 发起的流程以sendLoginName指定的A8用户为发起人,进入后续节点的待办中。 6.3 轮询完成的表单流程

1. 发起的表单流程在A8中流转。

2. 为了获取流程的状态,定时轮询,调用BPMService的getFormCollIdsByDateTime服务,获取已经流转

结束的流程。 6.4 导出A8表单流程到外部系统

调用DocumentService的exportFlow以XML格式导出表单流程,解析XML,将数据导入目标系统。

7. 附录

7.1 术语表 词条 SSO 名称 单点登录 意义 SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。 统一的认证系统是SSO的前提之一。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。 Portlet是一种Web组件,就像servlet。是专为将合成页面里的内容聚集在一起而设计的。每个portle都会生成标记段,并与别的portlet生成的标记段组合在一起嵌入到portal页面的标记内。 Ticket 单点登录认证标志 Portlet

本文来源:https://www.bwwdw.com/article/dtuf.html

Top