泛微协同办公应用平台e-cology接口培训文档
Integration Manuals of Weaver e-cology™
版 本
文档简要信息: | ||||||
文档主题(Title) | 泛微协同办公应用平台e-cology接口培训文档 | |||||
作者(Author) | 陈文建 | |||||
审批者(To Be Approved By) | ||||||
说明(Comments) | ||||||
文件名称(File Name) | 泛微协同办公应用平台e-cology接口培训文档.doc | |||||
文档版本历史: | ||||||
序号 | 日期 | 版本 | 变更说明 | 修改人 | 注释 | |
2011-9-30 | V1.0 | 陈文建 | ||||
1. 配置数据源文件datasource.xml(该文件位于e-cology的WEB-INF/service/目录下) 5
1. 配置调度文件schedule.xml(该文件位于e-cology的WEB-INF/service/目录下) 11
3. 在5.0及以上版本对于CronJob可以直接在进行可视化的配置 12
第三部分 流程流转过程中和异构系统数据交互(action) 16
数据源配置
接口说明
该接口主要用来在e-cology配置和异构系统的数据库的链接方式,通过此链接在e-cology中直接操作其他系统的数据。该接口适用于SQLSERVER,ORACLE,MYSQL,DB2,INFORMIX,SYBASE结构型数据库。
实现方法&步骤
配置数据源文件datasource.xml(该文件位于e-cology的WEB-INF/service/目录下)
<?xml version=”1.0″ encoding=”GBK”?>
<module id=”datasource” version=”1.0.0″> <service-point id=“dt1” interface=”weaver.interfaces.datasource.DataSource”> <invoke-factory> <construct class=”weaver.interfaces.datasource.BaseDataSource”> <set property=”type” value=”oracle“/> <set property=”host” value=”192.168.0.205“/> <set property=”dbname” value=“erp“/> <set property=”user” value=”xmgl“/> <set property=”password” value=”12345“/> <set property=”minconn” value=”5“/> <set property=”maxconn” value=”10“/> </construct> </invoke-factory> </service-point> <service-point id=“dt2” interface=”weaver.interfaces.datasource.DataSource”> <invoke-factory> <construct class=”weaver.interfaces.datasource.BaseDataSource”> <set property=”type” value=”oracle“/> <set property=”host” value=”192.168.0.204“/> <set property=”port” value=”1521” /> <set property=”dbname” value=“test“/> <set property=”user” value=”xmgl“/> <set property=”password” value=”12345“/> <set property=”minconn” value=”5“/> <set property=”maxconn” value=”10“/> </construct> </invoke-factory> </service-point> </module> |
上文中配置两个数据源,其中黑体部分是在配置每个数据源时需要改变的内容。
注意:每次配置后需要重启OA服务方可生效;
属性说明
-
- Id; 这个是引用该数据源的唯一标识
- Type:数据库类型(sqlserver2000, sqlserver2005, sqlserver2008,oracle,mysql,Informix,db2
,sybase)
-
- Host: 数据库服务器地址
- port:数据库服务的端口号
- Dbname:数据库名(实例名)
- User:访问数据库的用户名
- password:访问数据库的密码
- minconn,maxconn: 访问该数据库最大连接和最小连接
在5.0及以上版本可以直接在进行可视化的配置
通过顶部菜单【设置中心】【外部接口设置】【数据源配置】即可进入配置界面
Ecology8中界面如下:
点击右键【新建】即可创建一个新的数据源
Ecology8界面:
注意:该配置,不需要重启OA服务即可生效;
可视化配置属性说明
-
- 数据源名称,即xml配置中的id; 这个是引用该数据源的唯一标识
- 数据库类型,即xml配置中的Type:数据库类型(sqlserver2000, sqlserver2005, sqlserver2008,oracle,mysql,Informix,db2,sybase)
- 服务器ip,即xml配置中的Host: 数据库服务器地址
- 端口号,即xml配置中的port:数据库服务的端口号
- 数据库名,即xml配置中的Dbname:数据库名(实例名)
- 用户名,即xml配置中的User:访问数据库的用户名
- 密码,即xml配置中的password:访问数据库的密码
- 最小连接数、最大连接数,即xml配置中的minconn,maxconn: 访问该数据库最大连接和最小连接
如何引用该数据源
定义上面的数据源后可以在其他接口开发中直接使用,配合其他接口,还可以有其他方式引用数据源,在后面将有介绍
package weaver.workflow.datasourcetest;
import weaver.general.StaticObj; import weaver.interfaces.datasource.DataSource; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.SQLException; import weaver.general.BaseBean; public class datasourcetest { /** * 获取自定义datasource的connection * * @param datasourceid * 数据源id,为datasource.xml中的module.id+”.”+service-point.id,如datasource.dt1 * @return */ public Connection getConnection(String datasourceid) { Connection conn = null; try { DataSource datasource = (DataSource) StaticObj.getServiceByFullname(datasourceid, DataSource.class); //获取数据源的信息 conn = datasource.getConnection(); //和数据源取得连接 } catch (Exception e) {
} return conn; } /** * 关闭Connection * * @param conn */ public void closeConnection(Connection conn) { if (conn != null) { try { conn.close(); } catch (SQLException e) { writeLog(e); } } } } |
自定义定时器
接口说明
该接口用来用户在e-cology系统自由定义一些需要定时执行的操作,它是由Quartz这一个开源的作业调度框架来实现;
该接口通过配置调度时间和自行开发调度动作来实现需要定时执行的任务。
该接口提供了两种调度方式
IntervalJob接口,此接口每隔一段时间执行一次(自己定义间隔时间)
CronJob接口,此接口在指定的时间点执行(自己定义时间点)
在开发调度动作需要实现e-cology提供的自定义动作接口。
实现方法&步骤
配置调度文件schedule.xml(该文件位于e-cology的WEB-INF/service/目录下)
<?xml version=”1.0″ encoding=”GBK”?>
<module id=”datasource” version=”1.0.0″> <service-point id=”job1” interface=”weaver.interfaces.schedule.IntervalJob”> <invoke-factory> <construct class=”MyIntervalJob “> <set-service property=”ds” service-id=”datasource.dt1“/> <set property=”second” value=”60“/> <set property=”userid” value=” 100″ /> </construct> </invoke-factory> </service-point> <service-point id=”job2” interface=”weaver.interfaces.schedule.CronJob”> <invoke-factory> <construct class=”MyCronJob “> <set-service property=”ds” service-id=”datasource.dt2“/> <set property=”cronExpr” value=”0 44 12 ? * MON-FRI”/> <set property=”userid” value=” 100″ /> </construct> </invoke-factory> </service-point> |
上文中配置两个调度任务job1,job2,实现了两种调度策略,其中黑体部分是在配置每个调度时需要改变的内容;
注意:每次配置后需要重启OA服务方可生效;
属性说明
-
- Id:唯一标识该调度任务,无其他作用
- service-id:上文定义的自定义数据源,如果任务执行的动作中需要和数据源中的数据库交付数据,需要设置该属性
- class:该任务真正执行的操作,其中job1中MyIntervalJob必须继承weaver.interfaces.schedule.IntervalJob,job2中MyCronJob必须继承weaver.interfaces.schedule.CronJob;继承后需要实现的方法是其中的execute();
- value:任务执行的频率,在JOB1中表示没60秒执行一次,在JOB2中表示每周一到周五12:44执行(JOB2的执行频率配置方式和一般LINUX操作系统的定时任务配置方式一致)
在5.0及以上版本对于CronJob可以直接在进行可视化的配置
通过顶部菜单【设置中心】【外部接口设置】【配置计划任务接口】即可进入配置界面
(Ecology8截图)
点击右键【新建】即可创建一个新的【计划任务】
(Ecology8截图)
注意:
-
-
- 该配置,不需要重启OA服务即可生效
- 可视化配置,目前不支持其它属性的配置,如上面的配置文件中的
-
<set-service property=”ds” service-id=”datasource.dt2“/>
<set property=”userid” value=” 100″ />
所有建议大家在使用该接口的时候,可以直接去修改xml文件,可视化配置会在后期完善。
可视化配置属性说明
-
- 计划任务标识,即xml配置中的Id:唯一标识该调度任务,无其他作用
- 计划任务类,即xml配置中的class:该任务真正执行的操作,MyCronJo必须继承weaver.interfaces.schedule.CronJob;继承后需要实现的方法是其中的execute();
- 定时时间,即xml配置中的value:任务执行的频率,表示每周一到周五12:44执行(执行频率配置方式和一般LINUX操作系统的定时任务配置方式一致)
如何实现任务执行的操作
实现定时执行的操作,实际上就是实现weaver.interfaces.schedule.BaseIntervalJob 或者weaver.interfaces.schedule.BaseCronJob中的execute()方法
import weaver.interfaces.schedule.BaseIntervalJob;
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; /** * IntervalJob示范代码,集成BaseIntervalJob,用自己的业务逻辑覆盖了execute()方法,实际使用中这里可以编写用户需要实现的代码 */ public class MyIntervalJob extends BaseIntervalJob { //获得自定义属性userid的值 private String userid;
public String getUserid() { return userid; } public void execute() { //从数据源中获取连接 Connection conn = getDs().getConnection(); //此处是取得上文定义的数据源dt1,如果需要操作其他系统的数据才需要该定义 try { //通过jdbc获取人数 PreparedStatement s = conn.prepareStatement(“select count(*) as amount from hrmresource”); //此时假设在数据源dt1定义的数据库中有hrmresource表 ResultSet rs = s.executeQuery(); rs.next(); String amount = rs.getString(“amount”); //输出到控制台 System.out.println(“人数:” + amount); //关闭记录集 rs.close(); //关闭statement s.close(); } catch (Exception e) { } finally { try { //关闭连接 conn.close(); } catch (Exception e) { } } } } |
CronExpr表达式
一个cron表达式有至少6个有空格分隔的时间元素,按顺序依次为:
秒(0~59)
分钟(0~59)
小时(0~23)
天(月)(0~31,但是你需要考虑你月的天数)
月(0~11)
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
“0 0 12 * * ?” 每天中午12点触发
“0 15 10 ? * *” 每天上午10:15触发
“0 15 10 * * ?” 每天上午10:15触发
“0 * 14 * * ?” 在每天下午2点到下午2:59期间的每1分钟触发
“0 0/5 14 * * ?” 在每天下午2点到下午2:55期间的每5分钟触发
“0 0/5 14,18 * * ” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
“0 0-5 14 * * ?” 在每天下午2点到下午2:05期间的每1分钟触发
“0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44触发
“0 15 10 ? * MON-FRI” 周一至周五的上午10:15触发
“0 15 10 15 * ?” 每月15日上午10:15触发
“0 15 10 L * ?” 每月最后一日的上午10:15触发
“0 15 10 ? * 6L” 每月的最后一个星期五上午10:15触发
“0 15 10 ? * 6#3” 每月的第三个星期五上午10:15触发
有些子表达式能包含一些范围或列表
例如:子表达式(天(星期))可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”
“*”字符代表所有可能的值
因此,“*”在子表达式(月)里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天
“/”字符用来指定数值的增量
例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟
在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样
“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值
当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
流程流转过程中和异构系统数据交互(action)
接口说明
该接口主要实现在流程的流转当中,实时通过自定义的动作去操作异构形体系统的数据或者是其他一些特定的操作。
在流程的每个出口都可以定义这样的自定义动作,从而实现在流程流转过程导入,导出流程的相关信息,或者将流程信息和其他应用相结合。
实现方法&步骤
1、配置接口文件(action.xml)
2、编写接口(action)实现代码
3、流程管理员把action.xml中定义的接口设置为流程节点附加操作后,就可以实现流程到达该节点前(或离开该节点后)执行接口实现代码。
4、在流程设置中应用该功能
xml文件配置
该文件名为action.xml,位于(该文件位于e-cology的WEB-INF/service/目录下)
<?xml version=”1.0″ encoding=”GBK”?>
<module id=”datasource” version=”1.0.0″> <service-point id=”baseAction” interface=”weaver.interfaces.workflow.action.Action”> <invoke-factory> <construct class=”weaver.interfaces.workflow.action. BaseAction “> <set-service property=”ds” service-id=”datasource.dt1“/> <set property=”userid” value=”100″ /> </construct> </invoke-factory> </service-point> |
说明: 以上定义了一个id 为 baseAction的action,其中黑体部分是在配置每个动作时需要改变的内容;
注意:每次配置后需要重启OA服务方可生效;
属性说明
-
- Id: 为该动作的id,不能重复,在后文件将会使用该标识
- Class: 具体实现的动作类
- service-id:为该动作要使用的数据源,如果该动作需要好异构系统交互数据,在此可以设置前文配置好的数据源。
如果添加一个新的动作,只需修改以上的参数就可以
如果一个动作中,用到多个数据源,也可以类似的添加进去,如:
<set-service property=”ds1″ service-id=”datasource.xxx”/>
只要 property 的值不相同就可以。
配置其它属性值,可以安装下面的方式配置,可以配置多个,但property的值不能重复
<set property=”userid” value=”100″ />
在5.0及以上版本可以直接在进行可视化的配置
通过顶部菜单【设置中心】【外部接口设置】【配置接口动作】即可进入配置界面
点击右键【新建】即可创建一个新的【接口动作】
注意:
- 该配置,不需要重启OA服务即可生效
- 可视化配置目前不支持数据源和属性值配置,后期会完善。
可视化配置属性说明
-
- 接口动作标识,即xml配置中的Id: 为该动作的id,不能重复,在后文件将会使用该标识
- 接口动作类文件,即xml配置中的Class: 具体实现的动作类
Action接口代码编写
编写接口(action)实现代码,在上面的配置中,具体要实现的动作将体现在weaver.interfaces.workflow.action.BaseAction类中。该类必须实现weaver.interfaces.workflow.action.Action接口,该接口中包含execute(RequestInfo request),这个方法会在流程节点到达前或节点到达后被e-cology调用。
示例代码:
package weaver.interfaces.workflow.action;
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import weaver.general.Util; import weaver.soa.workflow.request.Cell; import weaver.soa.workflow.request.DetailTable; import weaver.soa.workflow.request.Property; import weaver.soa.workflow.request.RequestInfo; import weaver.soa.workflow.request.Row; public class BaseAction implements Action { public String execute(RequestInfo request) { //取主表数据 Property[] properties = request.getMainTableInfo().getProperty();// 获取表单主字段信息 for (int i = 0; i < properties.length; i++) { String name = properties[i].getName();// 主字段名称 String value = Util.null2String(properties[i].getValue());// 主字段对应的值 System.out.println(name + ” ” + value); } //取明细数据 DetailTable[] detailtable = request.getDetailTableInfo() .getDetailTable();// 获取所有明细表 if (detailtable.length > 0) { for (int i = 0; i < detailtable.length; i++) { DetailTable dt = detailtable[i];// 指定明细表 Row[] s = dt.getRow();// 当前明细表的所有数据,按行存储 for (int j = 0; j < s.length; j++) { Row r = s[j];// 指定行 Cell c[] = r.getCell();// 每行数据再按列存储 for (int k = 0; k < c.length; k++) { Cell c1 = c[k];// 指定列 String name = c1.getName();// 明细字段名称 String value = c1.getValue();// 明细字段的值 System.out.println(name + ” ” + value); } } } } return Action.SUCCESS; } } |
以上class中可以在execute(RequestInfo request)方法中定义任何想要执行的操作,上面的示例描述了在execute(RequestInfo request)方法中获取当前流程的所有信息。
流程节点附加操作接口调用
在e-cology流程管理中配置一下节点附加操作可以看到下图所示,可以在任意一个节点上设置,当流程流到改节点,自动触发预先定义好的动作
短信API接口
接口说明
该接口用来实现调用各短信厂商提供的短信发送网关或者信息机实现e-cology短信发送的功能。
实现方法&步骤
实现方法分为两类:一类是使用中间表方式实现,另外一类是可自行编写接口代码方式来调用方法;
中间表实现方法:接口的原理很简单,就是e-cology只负责把需要发送的短信数据放到中间表里,由短信设备供应商或客户自己把中间表里的数据发送出去。实际上大多数短信设备供应商已经实现了通过中间表方式发送短信。
接口对中间表的存放的位置、中间表名及字段名没有要求,因为往中间表插入数据的sql是在配置文件中指定的,但是有两点要注意
1. 必须使用sql server、oracle、mysql、db2数据库,其他的数据库暂时不支持。
2. 必须有用于存放短信内容、短信接受人的字段。
在理解了上面的原理之后,我们可以继续了解配置使用接口的方法。
流程提交前执行自定义函数
接口说明
针对html模式的流程,可以在流程提交前执行一个自定义函数,这个函数是通过重写checkCustomize这个函数来实现的。
实现方法&步骤
- 在html模板里面加入如下代码就行
<script type=”text/javascript”>
jQuery(document).ready(function(){ //重写checkCustomize函数 checkCustomize = function (){ //请假天数为空的时候,不允许流程提交 //10146为字段的id,我这边演示的请假天数这个字段的id //大家需要根据自己的系统来做对应的修改 //函数最后需要有一个返回值,返回false时候,不能提交流程。 //返回true时,流程正常流转 var field10146value = jQuery(“#field10146″).val(); if(field10146value==””){ alert(“请假天数不能为空!”); return false; }else{ return true; } } }); </script> |
- 应用效果如下:
工作流程webservices接口
接口说明
可以通过该接口对系统中的流程进行操作。具体方法见下面的使用说明。
使用说明
一、检查部署是否成功:输入下面的地址
http://192.168.4.183(换成实际的地址):8060(实际的端口号)/services/,界面中有如下服务即可:
注意:
检查下该配置
D\weaver\ecology\classbean\META-INF\xfire\services.xml
看WorkflowService的配置是否如下,如果不是请修改成下面一样
<service>
<name>WorkflowService</name> <namespace>webservices.services.weaver.com.cn</namespace> <serviceClass>weaver.workflow.webservices.WorkflowService</serviceClass> <implementationClass>weaver.workflow.webservices.WorkflowServiceImpl</implementationClass> </service> |
采用Web Serverice技术进行协同系统和业务系统进行数据交互,由协同系统方开发实现Web Serverice服务,业务系统方需在本地实现Web Serverice本地代理来进行调用。
<servlet>
<servlet-name>XFireServlet</servlet-name> <display-name>XFire Servlet</display-name> <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> |
协同系统方需提供的服务接口如下:
- 流程创建接口
- 流程流转控制接口
提供流程提交,退回和转发控制接口
- 需业务系统处理的任务列表
根据用户id和流程id获取该人员需要业务系统处理的任务列表,如果需要获取表单的数据在通过reqestid调用获取表单数据接口
- 获取表单数据接口
根据协同系统中流程主键requestid获取表单中所有数据
- 已归档任务列表
根据创建人id和流程id获取已经归档的任务列表
2.2.2接口说明
接口名称 | 参数说明 | 返回值 | 功能描述 |
创建新流程: | WorkflowRequestInfo wri:
请求信息对象 userId: 用户id |
String:新流程的requestid
如果小于0表示失败 -1:创建流程失败 -2:用户没有流程创建权限 -3:创建流程基本信息失败 -4:保存表单主表信息失败 -5:更新紧急程度失败 -6:流程操作者失败 -7:流转至下一节点失败 -8:节点附加操作失败 |
根据请求信息对象创建一条新的流程,请求信息对象中需包含创建人、创建流程id和表单的数据 |
代办数量:
getToDoWorkflowRequestCount |
int userId:
用户id String[] conditions: 查询流程的条件,为字符串数组 |
Int:代办的数量 | 返回满足条件的用户可以得到的代办数目 |
代办列表:
getToDoWorkflowRequestList |
int pageNo:
当前页数 int pageSize: 每页的分页数量 总行数 int userId: 用户id String[] conditions: 查询流程的条件,为字符串数组类型 |
WorkflowRequestInfo []:请求基本信息列表 | 根据参数条件获取需处理任务列表
排除创建节点任务 |
归档数目:
getRejectRequestCount |
int userId:
用户id String[] conditions: 查询流程的条件,为字符串数组 |
Int:归档的数量 | |
归档任务:
getProcessedRequest |
int pageNo:
当前页数 int pageSize: 每页的分页数量 总行数 int userId: 用户id String[] conditions: 查询流程的条件,为字符串数组类型 |
WorkflowRequestInfo []:请求基本信息列表 | 根据参数条件获取归档任务列表 |
流程提交:
submitWorkflowRequest |
WorkflowRequestInfo request:
请求信息对象 int requestid: 请求id int userid: 提交人ID 类型 String remark: 提交意见 |
Boolean:
True 成功 False 失败 |
流程提交
Type: submit 提交 reject 退回 |
流程退回:
nextNodeByReject |
int requestid:
请求id int userid: 提交人ID String remark: 退回意见 |
Boolean:
True 成功 False 失败 |
流程退回 |
流程转发:
forwardWorkflowRequest |
int requestid:
请求id String forwardoperator: 接收人id 多个用逗号分隔 String remark: 转发意见 String userId: 用户用户id String clientip: 客户端ip地址 |
Boolean:
True 成功 False 失败 |
流程转发 |
搜索所有可用流程数量:
getAllWorkflowRequestCount |
Int userid:
用户id String[] conditions: 查询条件字符串数组 |
Int
返回数目 |
workflow_requestbase t1,workflow_currentoperator t2,workflow_base t3 |
所有可用流程列表
getAllWorkflowRequestList |
int pageNo:
当前页数 int pageSize: 每页的分页数量 总行数 int userId: 用户id String[] conditions: 查询流程的条件,为字符串数组类型 |
WorkflowRequestInfo []:请求基本信息列表 | 根据参数条件获取可用任务列表 |
得到所有抄送的流程数量
getCCWorkflowRequestCount |
Int userid:
用户id String[] conditions: 查询条件字符串数组 |
Int
返回数目 |
|
得到所有抄送流程列表
getCCWorkflowRequestList |
int pageNo:
当前页数 int pageSize: 每页的分页数量 总行数 int userId: 用户id String[] conditions: 查询流程的条件,为字符串数组类型 |
WorkflowRequestInfo []:请求基本信息列表 | 根据参数条件获得抄送流程列表 |
得到可创建的工作流数量
getCreateWorkflowCount |
Int userid:
用户id String[] conditions: 查询条件字符串数组 |
Int
返回数目 |
|
取得可创建的工作流列表
getCreateWorkflowList |
int pageNo:
当前页数 int pageSize: 每页的分页数量 总行数 int userId: 用户id String[] conditions: 查询流程的条件,为字符串数组类型 |
WorkflowBaseInfo []:流程基本信息列表 | 根据参数条件获得可创建流程列表 |
取得可创建的工作流类型数量
getCreateWorkflowTypeCount |
Int userid:
用户id String[] conditions: 查询条件字符串数组 |
Int
可创建的工作流类型数量 |
|
取得可创建的工作流类型列表
getCreateWorkflowTypeList |
int pageNo:
当前页数 int pageSize: 每页的分页数量 总行数 int userId: 用户id String[] conditions: 查询流程的条件,为字符串数组类型 |
WorkflowBaseInfo[]:
工作流基本信息数组 |
根据参数条件获得可创建的流程类型列表 |
取得创建流程的相关信息
getCreateWorkflowRequestInfo |
Int workflowId:
流程id Int userid: 用户id |
WorkflowRequestInfo:
流程信息对象 |
|
取得已办工作流类型数量
getHendledWorkflowRequestCount |
Int userid:
用户id String[] conditions: 查询条件字符串数组 |
Int:
可创建流程数量 |
|
取得已办流程列表
getHendledWorkflowRequestList |
int pageNo:
当前页数 int pageSize: 每页的分页数量 总行数 int userId: 用户id String[] conditions: 查询流程的条件,为字符串数组类型 |
WorkflowRequestInfo []:请求基本信息列表 | 根据参数条件获得已办流程列表 |
取得已办工作流类型数量
getMyWorkflowRequestCount |
Int userid:
用户id String[] conditions: 查询条件字符串数组 |
Int:
我的请求流程数量 |
|
取得已办流程列表
getMyWorkflowRequestList |
int pageNo:
当前页数 int pageSize: 每页的分页数量 总行数 int userId: 用户id String[] conditions: 查询流程的条件,为字符串数组类型 |
WorkflowRequestInfo []:请求基本信息列表 | 根据参数条件获得我的请求列表 |
取得流程new标记
getWorkflowNewFlag |
String[] requestIds
多个流程id组成的数组 String ResourceId 人力资源id |
String[]:
结果数组,0或者1组成的数组 |
|
取得流程详细信息
getWorkflowRequest |
Int requestid
请求id Int userid 用户id Int fromrequestid 从相关id的工作流过来 |
WorkflowRequestInfo:流程信息 | |
写入流程查看日志
writeWorkflowReadFlag |
String requested
请求id String userId 用户id |
无返回值 | |
取得归档工作流类型数量
getProcessedWorkflowRequestCount |
Int userid:
用户id String[] conditions: 查询条件字符串数组 |
Int:
归档流程数量 |
|
取得归档流程列表
getProcessedWorkflowRequestList |
int pageNo:
当前页数 int pageSize: 每页的分页数量 总行数 int userId: 用户id String[] conditions: 查询流程的条件,为字符串数组类型 |
WorkflowRequestInfo []:请求基本信息列表 | 根据参数条件获得归档请求列表 |
接口对象说明:
1)WorkflowRequestInfo 工作流请求信息
/**
* 请求ID
*/
private String requestId;
/**
* 请求标题
*/
private String requestName;
/**
* 请求重要级别
*/
private String requestLevel;
/**
* 短信提醒
*/
private String messageType;
/**
* 流程类型
*/
private WorkflowBaseInfo workflowBaseInfo;
/**
* 当前节点名称
*/
private String currentNodeName;
/**
* 当前节点Id
*/
private String currentNodeId;
/**
* 流程状态
*/
private String status;
/**
* 创建者
*/
private String creatorId;
/**
* 创建时间
*/
private String createTime;
/**
* 最后操作者名称
*/
private String lastOperatorName;
/**
* 最后操作时间
*/
private String lastOperateTime;
/**
* 是否可查看
*/
private boolean canView;
/**
* 是否可编辑
*/
private boolean canEdit;
/**
* 签字意见是否必填
*/
private boolean mustInputRemark;
/**
* 主表信息
*/
private WorkflowMainTableInfo workflowMainTableInfo;
/**
* 明细表信息
*/
private WorkflowDetailTableInfo[] workflowDetailTableInfos;
/**
* 流转日志信息
*/
private WorkflowRequestLog[] workflowRequestLogs;
/**
* HTML显示模板
* 0 iPad
* 1 iPhone
*/
private String[] WorkflowHtmlTemplete;
/**
* 解析后的HTML显示内容
* 0 iPad
* 1 iPhone
*/
private String[] WorkflowHtmlShow;
/**
* 被代理人
*/
private String beagentid;
/**
* 流程短语
*/
private String[][] workflowPhrases;
2)WorkflowBaseInfo 工作流信息
/**
* 工作流ID
*/
private String workflowId;
/**
* 工作流标题
*/
private String workflowName;
/**
* 工作流类型ID
*/
private String workflowTypeId;
/**
* 工作流类型名称
*/
private String workflowTypeName;
2.2.3调用实例
根据实际的webservice客户端实现的客户端代码均不相同.以下仅供参考.
- 创建流程
/**
*创建流程,支持多明细,并且带附件字段–目前只支持一个附件,并且是(http格式的) * @throws Exception */ public static void createRequest() throws Exception { //主字段 WorkflowRequestTableField[] wrti = new WorkflowRequestTableField[4]; //字段信息 wrti[0] = new WorkflowRequestTableField(); wrti[0].setFieldName(“mutiresource”);//被留言人 wrti[0].setFieldValue(“111”);//被留言人字段的值,111为被留言人id wrti[0].setView(true);//字段是否可见 wrti[0].setEdit(true);//字段是否可编辑
wrti[1] = new WorkflowRequestTableField(); wrti[1].setFieldName(“remark”);//留言内容 wrti[1].setFieldValue(“test”); wrti[1].setView(true); wrti[1].setEdit(true); wrti[2] = new WorkflowRequestTableField(); wrti[2].setFieldName(“resource_n”);//留言人 wrti[2].setFieldValue(“111”); wrti[2].setView(true); wrti[2].setEdit(true); wrti[3] = new WorkflowRequestTableField(); wrti[3].setFieldName(“fj2”);//附件 wrti[3].setFieldType(“http:baidu_sylogo1.gif”);//http:开头代表该字段为附件字段 wrti[3].setFieldValue(“http://www.baidu.com/img/baidu_sylogo1.gif”);//附件地址 wrti[3].setView(true); wrti[3].setEdit(true);
WorkflowRequestTableRecord[] wrtri = new WorkflowRequestTableRecord[1];//主字段只有一行数据 wrtri[0] = new WorkflowRequestTableRecord(); wrtri[0].setWorkflowRequestTableFields(wrti);
WorkflowMainTableInfo wmi = new WorkflowMainTableInfo(); wmi.setRequestRecords(wrtri);
//明细字段 WorkflowDetailTableInfo wdti[] = new WorkflowDetailTableInfo[2];//两个明细表0明细表1,1明细表2
//明细表1 start wrtri = new WorkflowRequestTableRecord[2];//数据 行数,假设添加2行明细数据 //第一行 wrti = new WorkflowRequestTableField[3]; //每行3个字段 wrti[0] = new WorkflowRequestTableField(); wrti[0].setFieldName(“sl”);//数量 wrti[0].setFieldValue(“11”); wrti[0].setView(true); wrti[0].setEdit(true);
wrti[1] = new WorkflowRequestTableField(); wrti[1].setFieldName(“dj”);//单价 wrti[1].setFieldValue(“2”); wrti[1].setView(true); wrti[1].setEdit(true); wrti[2] = new WorkflowRequestTableField(); wrti[2].setFieldName(“xj”);//小记 wrti[2].setFieldValue(“22”); wrti[2].setView(true); wrti[2].setEdit(true);
wrtri[0] = new WorkflowRequestTableRecord(); wrtri[0].setWorkflowRequestTableFields(wrti);
//第二行 wrti = new WorkflowRequestTableField[3]; //每行3个字段 wrti[0] = new WorkflowRequestTableField(); wrti[0].setFieldName(“sl”);//数量 wrti[0].setFieldValue(“110”); wrti[0].setView(true); wrti[0].setEdit(true);
wrti[1] = new WorkflowRequestTableField(); wrti[1].setFieldName(“dj”);//单价 wrti[1].setFieldValue(“2”); wrti[1].setView(true); wrti[1].setEdit(true); wrti[2] = new WorkflowRequestTableField(); wrti[2].setFieldName(“xj”);//小记 wrti[2].setFieldValue(“220”); wrti[2].setView(true); wrti[2].setEdit(true);
wrtri[1] = new WorkflowRequestTableRecord(); wrtri[1].setWorkflowRequestTableFields(wrti);
wdti[0] = new WorkflowDetailTableInfo(); wdti[0].setWorkflowRequestTableRecords(wrtri);//加入明细表1的数据 //明细表1 end
//明细表2 start wrtri = new WorkflowRequestTableRecord[1];//数据行数,假设添加1行明细数据
//第一行 wrti = new WorkflowRequestTableField[3]; //每行3个字段 wrti[0] = new WorkflowRequestTableField(); wrti[0].setFieldName(“cl3”);// wrti[0].setFieldValue(“11”); wrti[0].setView(true); wrti[0].setEdit(true);
wrti[1] = new WorkflowRequestTableField(); wrti[1].setFieldName(“cl1111”);// wrti[1].setFieldValue(“2”); wrti[1].setView(true); wrti[1].setEdit(true); wrtri[0] = new WorkflowRequestTableRecord(); wrtri[0].setWorkflowRequestTableFields(wrti);
wdti[1] = new WorkflowDetailTableInfo(); wdti[1].setWorkflowRequestTableRecords(wrtri);//加入明细表2的数据 //明细表2 end
WorkflowBaseInfo wbi = new WorkflowBaseInfo(); wbi.setWorkflowId(“5”);//workflowid 5 代表内部留言
WorkflowRequestInfo wri = new WorkflowRequestInfo();//流程基本信息 wri.setCreatorId(“111”);//创建人id wri.setRequestLevel(“2”);//0 正常,1重要,2紧急 wri.setRequestName(“留言测试接口”);//流程标题 wri.setWorkflowMainTableInfo(wmi);//添加主字段数据 wri.setWorkflowBaseInfo(wbi); wri.setWorkflowDetailTableInfos(wdti);
//执行创建流程接口 WorkflowServicePortTypeProxy WorkflowServicePortTypeProxy = new WorkflowServicePortTypeProxy(); String requestid = WorkflowServicePortTypeProxy.doCreateWorkflowRequest(wri, 111); System.out.println(“requestid:”+requestid);
} |
- 获取代办列表数量
/**
* 获得代办事宜数量 * @throws RemoteException */ public static void getDaiBanShuLiang() throws RemoteException{ WorkflowServicePortTypeProxy WorkflowServicePortTypeProxy = new WorkflowServicePortTypeProxy(); int count = WorkflowServicePortTypeProxy.getToDoWorkflowRequestCount(111, null); System.out.println(“代办事宜数量:”+count);//获取待办事宜接口 //带查询条件查询,只能写关于这2个表的查询条件 workflow_requestbase t1,workflow_currentoperator t2 //查询条件里面不需要写and String conditions[] = new String[2]; conditions[0] = ” t1.currentnodetype = 2 “;//状态为审批 conditions[1] = ” t1.creater = 111 “;//创建人为111 count = WorkflowServicePortTypeProxy.getToDoWorkflowRequestCount(111, conditions); System.out.println(“代办事宜数量:”+count);//获取待办事宜接口 } |
- 获得代办事宜列表
/**
* 获得代办列表 */ public static void getDaiBanLieBiao() throws Exception{ WorkflowServicePortTypeProxy WorkflowServicePortTypeProxy = new WorkflowServicePortTypeProxy(); WorkflowRequestInfo WorkflowRequestInfo[] = WorkflowServicePortTypeProxy.getToDoWorkflowRequestList(1, 15, 100, 111, null);//获取待办事宜接口 System.out.println(“代办事宜列表数量:”+WorkflowRequestInfo.length); for(int i=0;i<WorkflowRequestInfo.length;i++){ WorkflowRequestInfo wri = WorkflowRequestInfo[i]; System.out.println(wri.getCreatorId()+” “+wri.getCreatorName()+” “+wri.getRequestName()+” “+wri.getCreateTime()); } } |
人力资源webservices接口
接口说明
可以通过该接口对系统中的人员组织架构进行操作。具体方法见下面的使用说明。
使用说明
检查web service是否已部署
在浏览器中输入http://ecologyServer/services,应显示如下页面:
如果未出先上述页面,则web service未部署成功,请与泛微项目人员联系。
接口部署成功之后,需要在OA的HrmWebserviceIP.properties配置文件中配置调用接口客户端的IP,调用接口时传入的参数ip包涵在此配置文件才能调用以下接口。
接口方法概述
名称 | 参数 | 返回值 | 功能描述 |
SynSubCompany | String ipaddress:调用接口的IP地址,String xmlData:分部信息的xml | 成功:1,失败:0,2:无权限调用 | 同步分部信息 |
SynDepartment | String ipaddress:调用接口的IP地址,String xmlData:部门信息的xml | 成功:1,失败:0,2:无权限调用 | 同步部门信息 |
SynJobtitle | String ipaddress:调用接口的IP地址,String xmlData:岗位信息的xml | 成功:1,失败:0,2:无权限调用 | 同步岗位信息 |
SynHrmResource | String ipaddress:调用接口的IP地址,String xmlData:人员信息的xml | 成功:1,失败:0,2:无权限调用 | 同步人员信息 |
getHrmSubcompanyInfo | String ipaddress:调用接口的IP地址, | SubCompanyInfo[]:分部信息列表 | 获取所有分部信息列表 |
getHrmDepartmentInfo | String ipaddress:调用接口的IP地址,String subcompanyId:分部id,多个用逗号分隔(不为空时该条件有效) | DepartmentInfo[]:部门信息列表 | 根据参数条件获取部门信息列表 |
getHrmJobTitleInfo | String ipaddress:调用接口的IP地址,String subcompanyId:分部id,多个用逗号分隔(不为空时该条件有效)
String departmentid: 部门id,多个用逗号分隔(不为空时该条件有效) |
JobTitleInfo[]:岗位信息列表 | 根据参数条件获取岗位信息列表 |
getHrmUserInfo | String ipaddress:调用接口的IP地址,String subcompanyId:分部id,多个用逗号分隔(不为空时该条件有效)
String departmentid: 部门id,多个用逗号分隔(不为空时该条件有效) String jobtitleid: 岗位id,多个用逗号分隔(不为空时该条件有效) String lastChangeDate: 最后修改日期,日期格式“YYYY-MM-DD”(不为空时该条件有效) String workcode: 人员编码(不为空时该条件有效) |
UserInfo[]:用户信息列表 | 根据参数条件获取用户信息列表 |
checkUser | String ipaddress:调用接口的IP地址
String loginid:登录名 String password:密码 |
True:表示存在
False:表示不存在 |
检测OA用户 |
接口相关对象说明
1)SynSubCompany 同步分部传入xml的格式如下(一定要按照此格式传入):
<?xml version=”1.0″ encoding=”UTF-8″?>
<root>
<orglist>
<org action=”add”>
<code>001</code>
<shortname>测试分部一</shortname>
<fullname>测试分部一</fullname>
<parent_code>0</parent_code>
<order>0</order>
</org>
<org action=”edit”>
<code>002</code>
<shortname>测试分部二</shortname>
<fullname>测试分部二</fullname>
<parent_code>0</parent_code>
<order>1</order>
</org>
<org action=”delete”>
<code>003</code>
<canceled>1</canceled>
</org>
</orglist>
</root>
相关属性说明:
Action:动作,add:添加,edit:编辑,delete:删除,OA中只做封存和解封,canceled=1封存,canceled=0解封
Code:分部编码,唯一值
Shortname:分部简称
Fullname:分部全称
Parent_code:上级分部编码,没有上级请填写0
Order:排序值
2)SynDepartment同步部门传入xml的格式如下(一定要按照此格式传入):
<?xml version=”1.0″ encoding=”UTF-8″?>
<root>
<orglist>
<org action=”add”>
<code>0001</code>
<shortname>测试部门一</shortname>
<fullname>测试部门一</fullname>
<org_code>001</org_code>
<parent_code>0</parent_code>
<order>0</order>
</org>
<org action=”edit”>
<code>0002</code>
<shortname>测试部门二</shortname>
<fullname>测试部门二</fullname>
<org_code>003</org_code>
<parent_code>0</parent_code>
<order>1</order>
</org>
<org action=”del”>
<code>0003</code>
<canceled>1</canceled>
</org>
</orglist>
</root>
相关属性说明:
Action:动作,add:添加,edit:编辑,delete:删除,OA中只做封存和解封,canceled=1封存,canceled=0解封
Code:部门编码,唯一值
Shortname:部门简称
Fullname:部门全称
Org_code:分部编码
Parent_code:上级部门编码,没有上级请填写0
Order:排序值
3)SynJobtitle同步岗位传入xml的格式如下(一定要按照此格式传入):
<?xml version=”1.0″ encoding=”UTF-8″?>
<root>
<jobtitlelist>
<jobtitle action=”add”>
<jobtitlecode>00001</jobtitlecode>
<jobtitlename>测试岗位一</jobtitlename>
<jobtitleremark>测试岗位一</jobtitleremark>
<jobtitledept>0001</jobtitledept>
</jobtitle>
<jobtitle action=”edit”>
<jobtitlecode>00002</jobtitlecode>
<jobtitlename>测试岗位二</jobtitlename>
<jobtitleremark>测试岗位二</jobtitleremark>
<jobtitledept>0002</jobtitledept>
</jobtitle>
<jobtitle action=”delete”>
<jobtitlecode>00003</jobtitlecode>
<jobtitlename>测试岗位三</jobtitlename>
</jobtitle>
</jobtitlelist>
</root>
相关属性说明:
Action:动作,add:添加,edit:编辑,delete:删除
Jobtitlecode:岗位编码,唯一值
Jobtitlename:岗位简称
Jobtitleremark:岗位全称
Org_code:分部编码
Jobtitledept:岗位所属部门编码
4)SynHrmResource同步人员传入xml的格式如下(一定要按照此格式传入):
<?xml version=”1.0″ encoding=”UTF-8″?>
<root>
<hrmlist>
<hrm action=”add”>
<workcode>10001</workcode>
<loginid>test</loginid>
<lastname>test</lastname>
<password>123456</password>
<subcompany>测试分部一</subcompany>
<department>测试部门一</department>
<jobtitle>测试岗位一</jobtitle>
<statue>正式</statue>
<managerid>1024</managerid>
<sex>男</sex>
<birthday>1988-09-09</birthday>
<telephone>12345678</telephone>
<mobile>12345678</mobile>
<email>test@163.com</email>
<maritalstatus>已婚</maritalstatus>
</hrm>
<hrm action=”edit”>
<workcode>10001</workcode>
<loginid>test</loginid>
<lastname>test</lastname>
<password>123456</password>
<subcompany>测试分部一</subcompany>
<department>测试部门一</department>
<jobtitle>测试岗位一</jobtitle>
<statue>正式</statue>
<managerid>1024</managerid>
<sex>男</sex>
<birthday>1988-09-09</birthday>
<telephone>12345678</telephone>
<mobile>12345678</mobile>
<email>test@163.com</email>
<maritalstatus>已婚</maritalstatus>
</hrm>
</hrmlist>
</root>
相关属性说明:
Action:动作,add:添加,edit:编辑
Workcode:人员编码,唯一值
Subcompany:分部
Department:部门
Lastname:姓名
Loginid:登录名
Password:密码
Seclevel:安全级别
Sex:性别
Jobtitle:岗位
Jobactivityid:职务
Jobgroupid:职务类别
Jobcall:职称
Joblevel:职级
Jobactivitydesc:职责描述
Managerid:直接上级(编码)
Assistantid:助理(编码)
Status:状态
Locationid:办公室
Workroom:办公地点
Telephone:办公电话
Mobile:移动电话
Mobilecall:其他电话
Fax:传真
Email:邮箱
Systemlanguage:系统语言
Birthday:出生日期
Folk:名族
Nativeplace:籍贯
Regresidentplace:户口
Certificatenum:身份证号码
Maritalstatus:婚姻状况
Policy:政治面貌
Bememberdate:入团日期
Bepartydate:入党日期
Islabouunion:工会会员
Educationlevel:学历
Degree:学位
Healthinfo:健康状况
Residentplace:现居住地
Homeaddress:家庭联系方式
Tempresidentnumber:暂住证号码
以上是人员同步的所有节点信息,需要同步那些字段,就填写相应的值。
5)SubCompanyInfo
/**
* 分部id
*/
private java.lang.String _subcompanyid;
/**
* 简称
*/
private java.lang.String _shortname;
/**
* 全称
*/
private java.lang.String _fullname;
/**
* 上级分部id
*/
private java.lang.String _supsubcompanyid;
/**
* 网站
*/
private java.lang.String _website;
/**
* 显示顺序
*/
private java.lang.String _showorder;
/**
* 公司编码
*/
private java.lang.String _code;
/**
* 是否封存
*/
private java.lang.String _canceled;
6)DepartmentInfo
/**
* 部门id
*/
private java.lang.String _departmentid;
/**
* 简称
*/
private java.lang.String _shortname;
/**
* 全称
*/
private java.lang.String _fullname;
/**
* 所属分部id
*/
private java.lang.String _subcompanyid;
/**
* 上级部门id
*/
private java.lang.String _supdepartmentid;
/**
* 显示顺序
*/
private java.lang.String _showorder;
/**
* 部门编码
*/
private java.lang.String _code;
/**
* 是否封存
*/
private java.lang.String _canceled;
7)JobTitleInfo
/**
* 岗位id
*/
private java.lang.String _jobtitleid;
/**
* 简称
*/
private java.lang.String _shortname;
/**
* 全称
*/
private java.lang.String _fullname;
/**
* 所属部门id
*/
private java.lang.String _departmentid;
/**
* 岗位职责
*/
private java.lang.String _jobresponsibility;
/**
* 任职资格
*/
private java.lang.String _jobcompetency;
/**
* 相关文档
*/
private java.lang.String _jobdoc;
/**
* 备注
*/
private java.lang.String _jobtitleremark;
8)UserInfo
private int userid ; //用户id
private String subcompanyid1; //分部
private String departmentid; //部门
private String workcode; //编号
private String lastname; //姓名
private String loginid; //系统账号
private String password; //密码
private String seclevel; //安全级别
private String sex; //性别
private String jobtitle; //岗位
private String jobactivityid; //职务
private String jobgroupid; //职务类型
private String jobcall; //职称
private String joblevel; //职级
private String jobactivitydesc;//职责描述
private String managerid; //直接上级
private String assistantid; //助理
private String status; //状态 eg:正式、试用等
private String locationid; //办公地点
private String workroom; //办公室
private String telephone; //办公电话
private String mobile; //移动电话
private String mobilecall; //其他电话
private String fax; //传真
private String email; //电子邮件
private String systemlanguage;//系统语言 默认7
private String birthday; //生日
private String folk; //名族
private String nativeplace; //籍贯
private String regresidentplace; //户口
private String certificatenum; //身份证号
private String maritalstatus; //婚姻状况
private String policy; //政治面貌
private String bememberdate; //入团日期
private String bepartydate; //入党日期
private String islabouunion; //是否是工会会员
private String educationlevel; //学历
private String degree; //学位
private String healthinfo; //健康状况
private String height; //身高
private String weight; //体重
private String residentplace; //居住地
private String homeaddress; //家庭住址
private String tempresidentnumber; //暂住证号码
private String startdate = “” ; //合同开始日期
private String enddate = “” ; //合同结束日期
private String createdate=””; //创建日期
private String lastChangdate=””; //最后修改日期
private int accounttype; //账号类型
private int dsporder; //显示顺序
以上是获得用户的基本信息字段
2.4 生成客户端
大家知道,在本地调用web service,最便利的方法是利用工具生成客户端代理,开发人员通过客户端代理去访问web service将会非常简单,就象调用本地的方法一样。各大主流的编程语言都提供了通过wsdl生成客户端代理的工具,如c#中的wsdl.exe和java中的wsdl2java。本文以java为例说明客户端的生成方法。
2.4.1客户端所需jar
commons-discovery-0.2.jar
javax-wsdl_1.5.1jar
commons-logging_1.0.4.jar
axis.jar
jaxrpc.jar
saaj.jar
activation.jar
mail.jar
2.4.2 生成客户端
使用eclipse向导生成Web Service客户端
示例程序
使用客户端同步公司信息
public static void main(String[] args) { try { String orgxml =””; HrmServiceClient client = new HrmServiceClient(); HrmServicePortType service = client.getHrmServiceHttpPort(); service. synSubCompany (“192.168.4.183”, orgxml); } catch (Exception e) { e.printStackTrace(); } } 检测用户: public static void main(String[] args) { try { HrmServiceClient client = new HrmServiceClient(); HrmServicePortType service = client.getHrmServiceHttpPort(); System.out.println(service.checkUser(“192.168.4.183”, “test”, “1”)); } catch (Exception e) { e.printStackTrace(); } } |
转载请注明:赫非域 » 系统接口培训文档Ecology8