其实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都能够获取的到,这就得在后台进行处理,然后跳转到这个页面的时候一起传过来在这边进行使用
思路:消息的 发送功能实现之后,在发送时多添加一句代码:即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地址/端口是否配置正确。