其实OA中集成rtx主要就有三方面的内容,包括组织架构的同步、单点登录、以及由OA向rtx发送消息,rtx有一个java开发的sdk包,可以在官网直接下载,里面集成了对于rtx操作的各种接口,可以直接调用
1.组织架构的同步
同步过程有几点必须注意:
(1)在往rtx添加根部门时,根部门的id必须设置为"0";
(2)rtx在添加部门信息时部门的id不能用英文、一有英文的话就会导致错乱,如果自己的数据里的部门id有英文的话,在添加部门时就得过滤掉英文。
同步的思路就是:将oa中的部门按照从根部门开始一直往下循环并同时添加到rtx中,判断是否有子部门,如果有,同时添加,并递归查看是否有子部门,直到最后一级。
/**
*
* 同步所有部门
*
*/
public void addAllDeps() {
//获取所有根部门
List<Department> topDepartments = departmentDao.getTopLevel();
for (Department department : topDepartments) {
//添加根部门
System.out.println("根部门id:" + department.getId());
System.out.println("根部门信息:" + department.getRemark());
System.out.println("根部门名字:" + department.getName());
String departmentId = department.getId().substring(1);
addDept(departmentId, department.getRemark(), department.getName(), "0");
if (department.getChildren().size() != 0) {
getChildDeps(department);
}
}
}
/**
*
* 根据父部门uuid来查找并添加所有子部门(递归)
*
*/
public void getChildDeps(Department department) {
List<Department> childDepsList = department.getChildren();
if (childDepsList.size() > 0) {
for (Department childDep : childDepsList) {
String parentDepartmentId = department.getId().substring(1);
String childDepartmentId = childDep.getId().substring(1);
System.out.println(childDepartmentId + ";" + childDep.getRemark() + ";" + childDep.getName() + ";"
+ parentDepartmentId);
addDept(childDepartmentId, childDep.getRemark(), childDep.getName(), parentDepartmentId);
if (childDep.getChildren().size() != 0) {
getChildDeps(childDep);
}
}
} else {
System.out.println("部门" + department.getUuid() + "没有子部门");
}
}
同步用户也是一样的道理
2.单点登录
思路:点击一个超链接的时候,会跳转到一个html页面,在这个页面进行单点登录的操作,由于我们不希望点击后还会出现一个新的页面,所以此时最好是使用一个隐藏的iframe,这样用户就看不见页面跳转的过程了。
操作单点登录的html页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="rtx.RTXSvrApi"%>
<%
RTXSvrApi rtxApi = new RTXSvrApi();
String account = (String)request.getAttribute("loginName");//当前用户登录名
String ip = rtxApi.getServerIP(); //服务器ip
String key= rtxApi.getSessionKey(account); //获取sessionKey
String rtxClientDownloadAddress = (String)request.getAttribute("rtxClientDownloadAddress");//rtx客户端下载地址
System.out.println(account);
System.out.println(ip);
System.out.println(key);
%>
<html>
<head>
</head>
<body text="#000000">
<html><head><script language="vbscript" id="clientEventHandlersVBS">
<!--
'单点登录
Sub Window_OnLoad()
on error resume next
Set objProp = RTXAX.GetObject("Property")
objProp.Value("RTXUsername") = "<%=account%>"
objProp.Value("LoginSessionKey") = "<%=key%>"
objProp.Value("ServerAddress") = "<%=ip%>"
objProp.Value("ServerPort") = 8000
lsRTXDownload= "<%=rtxClientDownloadAddress%>"
RTXAX.Call 2, objProp
If Err.Number <> 0 Then
if Err.Number=438 then
MsgBox "请下载安装RTX客户端软件"
if lsRTXDownload<>"" Then Window.Open lsRTXDownload
Else
MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
End if
Err.Clear ' Clear the error.
End If
End Sub
-->
</script></head><body>
<OBJECT classid="clsid:5EEEA87D-160E-4A2D-8427-B6C333FEDA4D" id=RTXAX style="display:none"></OBJECT>
</body></html>
</body>
</html>
jsp页面:
<a href="${ctx }/basicdata/rtx/singlesignon" target="rtx">即时通讯</a>
<iframe src="about:blank" name="rtx" width=0 height=0 frameborder=0 ></iframe>
使用以上的这个html页面就能够实现单点登录的功能,但是前提是:当前用户id,服务器ip以及sessionKey都能够获取的到,这就得在后台进行处理,然后跳转到这个页面的时候一起传过来在这边进行使用
3.往rtx发送消息
思路:消息的 发送功能实现之后,在发送时多添加一句代码:即rtx的调用发送消息的接口,按照参数进行设置即可
注意:
1、发送消息给rtx的时候调用rtx的接口的五个参数都不能为null,可以为空,只要有一个为null的话就会导致jvm发生错误。所以要加判断,如果得到的结果为null的话,就要转为空。
2、在服务端一定要记得安装RTX SDK服务,不然无法调用RTXSvrApi
3、对于RTX2012来说,setServerIP()指的是设置RTX服务器IP地址,而setServerPort()指的是设置RTX服务器SDK服务器端口(默认为6000),不是设置RTX服务器端口(默认为8000),如果将此方法误认为是设置RTX服务器端口的话,则在调用RTXSvrApi时会自动将System32文件夹或者是jdk的bin文件夹下的RtxServerApi.ini的端口设置改为8000,这样就会报错:错误代码:-992 错误信息:无法连接到 RTX SDK SERVER,请确认 RTXSERVERAPI.INI 中的IP地址/端口是否配置正确。