[TOC]

第一部分 数据源配置

一、 接口说明

该接口主要用来在e-cology配置和异构系统的数据库的链接方式,通过此链接在e-cology中直接操作其他系统的数据,该接口适用于SQLSERVER,ORACLE,MYSQL,DB2,INFORMIX,SYBASE结构型数据库。

二、 实现方法&步骤

1. 接口的使用实例

1.1 获取Connection,使用jdbc的方式操作数据库

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import weaver.general.BaseBean;
import weaver.general.StaticObj;
publicclass datasourcetest extends BaseBean{

publicvoid testDatasource(){
Connection conn = getConnection(“datasource.local”);//此处是取得上文定义的数据源dt1,如果需要操作其他系统的数据才需要该定义
try {
//通过jdbc获取人数
PreparedStatement s = conn.prepareStatement(“select count() as counthrm from hrmresource”);
ResultSet rs = s.executeQuery();
if(rs.next()){
String counthrm = rs.getString(“counthrm”);
//输出到控制台
System.out.println(“人数:” + counthrm);
writeLog(“人数:” + counthrm);
}
rs.close();//关闭记录集
s.close();//关闭statement
} catch (Exception e) {
writeLog(e);
} finally {
try {
closeConnection(conn);//关闭连接
} catch (Exception e) {
writeLog(e);
}
}
}

/**
获取自定义datasource的connection

@param datasourceid
数据源id,为”datasource”+数据源配置里面的数据源名称,
比如配置了一个数据源名称为local,那么这个数据源id为:datasource.local
@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
*/
publicvoid closeConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
}
catch** (SQLException e) {
writeLog(e);
}
}
}

}


1.2 使用系统封装好的数据库操作类

import weaver.conn.RecordSetDataSource;
import weaver.general.BaseBean;
publicclass datasourcetest1 extends BaseBean{

publicvoid testDatasource(){
//注意数据源标识不需要加datasource,比如上面的datasource.local,只需要写local
RecordSetDataSource rsds = new RecordSetDataSource(“数据源标识”);
rsds.executeSql(“select count() as counthrm from hrmresource”);
*while
(rsds.next()){
String counthrm = rsds.getString(“counthrm”);
System.out.println(“counthrm:”+counthrm);
writeLog(“counthrm:”+counthrm);
}
}
}

2. 配置数据源

2.1菜单入口
【后端】->【集成中心】à【数据源配置】
2.2操作界面
A.png
属性说明:
Ø 数据源名称,即xml配置中的id; 这个是引用该数据源的唯一标识
Ø 数据库类型:数据库类型(sqlserver2000, sqlserver2005, sqlserver2008,oracle,mysql,Informix,db2,sybase)
Ø 集群/多实例:标识数据库是否为集群/多实例,配置的参数会不一样
Ø 连接字符串: 数据库的链接地址
Ø 服务器ip:数据库服务器地址
Ø 端口号:数据库服务的端口号
Ø 数据库名:数据库名(实例名)
Ø 用户名:访问数据库的用户名
Ø 密码:访问数据库的密码
Ø 最小连接数: 访问该数据库最小连接
Ø 最大连接数: 访问该数据库最大连接

第二部分 计划任务

一、 接口说明

该接口用来用户在e-cology系统自由定义一些需要定时执行的操作,它是由Quartz这一个开源的作业调度框架来实现;
该接口通过配置调度时间和自行开发调度动作来实现需要定时执行的任务。
该接口提供的调度方式为:实现CronJob接口,此接口在指定的时间点执行(自己定义时间点)
在开发调度动作需要实现e-cology提供的自定义动作接口。

二、 实现方法&步骤

1. 接口的两种实现方式

1.1 继承weaver.interfaces.schedule.BaseCronJob,然后实现方法public void execute()

import weaver.interfaces.schedule.BaseCronJob;

publicclass DemoCronJob extends BaseCronJob {

/
计划任务的入口,五任何输入参数
/
publicvoid execute() {
//计划任务需要处理的业务逻辑
System.out.println(
new java.util.Date());
//输出日志
getLog().info(
new** java.util.Date());

}
}

1.2 实现weaver.interfaces.schedule.CronJob接口

import weaver.interfaces.schedule.CronJob;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

publicclass BaseCronJob implements CronJob {
private String cronExpr;//时间表达式
private Log log = LogFactory.getLog(BaseCronJob.class.getName());

public String getCronExpr() {
returncronExpr;
}

publicvoid setCronExpr(String cronExpr) {
this.cronExpr = cronExpr;
}

public Log getLog() {
returnlog;
}

publicvoid setLog(Log log) {
this.log = log;
}

publicvoid execute() {
getLog().error(“cron job is executed”);
System.out.println(“cron job is executed”);
}
}

2. 配置计划任务

2.1菜单入口
【后端】->【集成中心】à【计划任务】
2.2操作界面
属性说明:
Ø 计划任务标识:唯一标识该调度任务,无其他作用,如:BaseCronJob
Ø 计划任务类:已实现计划任务接口的操作类,如:weaver.interfaces.schedule.BaseCronJob
Ø 定时时间:时间为Cron表达式

3. 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. 接口实现方式

实现weaver.interfaces.workflow.action.Action接口即可
接口定义如下:

import weaver.soa.workflow.request.RequestInfo;

publicinterface Action {
publicstaticfinal String SUCCESS=”1”;

/
失败信息,返回此信息,如果是节点前附加操作,将会阻止流程提交
/
publicstaticfinal String FAILURE_AND_CONTINUE = “0”;

public** String execute(RequestInfo request);
}

Action示例代码:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import weaver.general.Util;
import weaver.hrm.User;
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;

publicclass DemoAction implements Action {
private Log log = LogFactory.getLog(DemoAction.class.getName());
private String p1; // 自定义参数1
private String p2; // 自定义参数2

public String getP1() {
returnp1;
}

publicvoid setP1(String p1) {
this.p1 = p1;
}

public String getP2() {
returnp2;
}

publicvoid setP2(String p2) {
this.p2 = p2;
}

public Log getLog() {
return log;
}

publicvoid setLog(Log log) {
this.log = log;
}

public String execute(RequestInfo requestinfo) {
System.out.println(“进入Action requestid=” + requestinfo.getRequestid());
String requestid = requestinfo.getRequestid();// 请求ID
String requestlevel = requestinfo.getRequestlevel();// 请求紧急程度
String src = requestinfo.getRequestManager().getSrc(); // 当前操作类型submit:提交/reject:退回
String workflowid = requestinfo.getWorkflowid();// 流程路径ID
String tablename = requestinfo.getRequestManager().getBillTableName();// 表单主表名称
intbillid = requestinfo.getRequestManager().getBillid();// 表单数据ID
User usr = requestinfo.getRequestManager().getUser();// 获取当前操作用户对象
String requestname = requestinfo.getRequestManager().getRequestname();// 请求标题
String remark = requestinfo.getRequestManager().getRemark();// 当前用户提交时的签字意见
intformid = requestinfo.getRequestManager().getFormid();// 表单ID
intisbill = requestinfo.getRequestManager().getIsbill();// 是否是自定义表单
//取主表数据
Property[] properties = requestinfo.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);
log.info(name + “ “ + value);
}
// 取明细数据
DetailTable[] detailtable = requestinfo.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);
log.info(name + “ “ + value);
}
}
}
}

//控制流程流转,增加以下两行,流程不会向下流转,表单上显示返回的自定义错误信息,这个控制只支持节点后附加操作
requestinfo.getRequestManager().setMessageid(“错误信息编号”);//126221
requestinfo.getRequestManager().setMessagecontent(“返回自定义的错误信息”);
System.out.println(“Action执行完成传入参数p1=” + this.getP1() + “ p2=”+ this.getP2());
log.info(“Action执行完成传入参数p1=” + this.getP1() + “ p2=” + this.getP2());

returnSUCCESS;// return返回固定返回SUCCESS

// //如果E8的版本是1604,也可以使用下面的代码进行控制,支持节点后、节点前、出口,注意必须返回 FAILURE_AND_CONTINUE;
// requestinfo.getRequestManager().setMessagecontent(“返回自定义的错误信息”);
// return FAILURE_AND_CONTINUE;

}

}

2. 配置自定义接口动作

2.1菜单入口
【后端应用中心】à【集成中心】à【流程流转集成】
2.2操作界面
属性说明:
Ø 接口动作名称: 动作名称
Ø 接口动作标识:接口动作标识不能重复
Ø 接口动作类文件:接口动作的实现类,比如:weaver.interfaces.workflow.action.DemoAction
Ø 参数名称:在配置接口动作的时候,可以为接口动作内部的参数进行赋值,参数名称的大小写必须和接口动作类中申明的参数名一致
Ø 参数值:参数名称对应的值
Ø 是否数据源:参数类型可以分为两种类型,一种为字符类型,另外一种为数据源。当选择为数据源时,参数的值需要填写数据源设置中的数据源名称

3. 流程节点附加操作接口调用

3.1 菜单入口
【后端应用中心】à【流程引擎】à【路径管理】à【路径设置】,在该菜单下选择一个具体的流程路径,然后流转设置下面的节点前附件操作、节点后附件操作和出口附件规则都可以引用自定义接口动作,当流程经过这些节点时,就会自动触发预先定义好的动作

第四部分 建模自定义接口动作(action)

一、 接口说明

该接口主要实现在对建模数据进行操作时候,可以触发自定义的接口动作,可以处理一些特殊的业务,比如对建模中的数据进行运算,或者把建模数据写入其他应用模块,或者写入第三方系统

二、 实现方法&步骤

1. 接口实现方式

实现weaver.interfaces.workflow.action.Action接口即可
接口定义如下:

import weaver.soa.workflow.request.RequestInfo;

publicinterface Action {
publicstaticfinal String SUCCESS=”1”;

/
失败信息,返回此信息,如果是节点前附加操作,将会阻止流程提交
/
publicstaticfinal String FAILURE_AND_CONTINUE = “0”;

public** String execute(RequestInfo request);
}

Action示例代码:

package weaver.interfaces.formmode.action;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import weaver.general.BaseBean;
import weaver.general.Util;
import weaver.interfaces.workflow.action.Action;
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;

publicclass ModeDemoAction extends BaseBean implements Action {
private Log log = LogFactory.getLog(ModeDemoAction.class.getName());
private String p1; // 自定义参数1
private String p2; // 自定义参数2

public String getP1() {
returnp1;
}

publicvoid setP1(String p1) {
this.p1 = p1;
}

public String getP2() {
returnp2;
}

publicvoid setP2(String p2) {
this.p2 = p2;
}

public Log getLog() {
returnlog;
}

publicvoid setLog(Log log) {
this.log = log;
}

public String execute(RequestInfo request) {
String id = request.getRequestid();//建模数据ID
String modeid = request.getWorkflowid();// 建模模块ID
String Creatorid = request.getCreatorid();//创建人id
String Lastoperator = request.getLastoperator();//当前操作者id
log.info(“id:”+id+” modeid:”+modeid);
System.out.println(“id:”+id+” modeid:”+modeid);

//取主表数据
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);
log.info(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);
log.info(name + “ “ + value);
}
}
}
}

return Action.SUCCESS;
}

}

2. 配置自定义接口动作

2.1菜单入口
【后端应用中心】à【集成中心】à【流程流转集成】
2.2操作界面
属性说明:
Ø 接口动作名称: 动作名称
Ø 接口动作标识:接口动作标识不能重复
Ø 接口动作类文件:接口动作的实现类,比如:weaver.interfaces.workflow.action.DemoAction
Ø 参数名称:在配置接口动作的时候,可以为接口动作内部的参数进行赋值,参数名称的大小写必须和接口动作类中申明的参数名一致
Ø 参数值:参数名称对应的值
Ø 是否数据源:参数类型可以分为两种类型,一种为字符类型,另外一种为数据源。当选择为数据源时,参数的值需要填写数据源设置中的数据源名称

3. 表单建模调用自定义接口动作

3.1 菜单入口:
【后端应用中心】à【建模引擎】à【模块】à【页面扩展】
3.2 操作界面如下:
说明:在外部接口动作选项后选择需要触发的自定义接口动作即可。

第五部分 短信API接口

一、 接口说明

该接口用来实现调用各短信厂商提供的短信发送网关或者信息机实现e-cology短信发送的功能。

二、 实现方法&步骤

实现方法分为两类:一类是使用中间表方式实现,另外一类是可自行编写接口代码方式来调用方法,由于中间表的方式不需要编写代码,所以下面只描述自定义接口的方式

1. 自定义接口

只需要实现系统中的weaver.sms.SmsService接口即可,接口定义如下:

publicinterface SmsService {
publicboolean sendSMS(String smsId,String number,String msg);
}

接口实现类示例:

import weaver.general.BaseBean;
import weaver.sms.SmsService;

publicclass TestService extends BaseBean implements SmsService {
publicboolean sendSMS(String smsId, String number, String msg) {
System.out.println(“接受人:” + number);
System.out.println(“测试短信:” + msg);
writeLog(“接受人:” + number);
writeLog(“测试短信:” + msg);
returntrue;
}
}

2. 配置自定义短信接口

2.1功能菜单入口
【后端应用中心】à【应用中心】à【通信】à【短信应用设置】à【短信服务方式】
2.2操作界面
属性说明:
Ø 短信接口类: 实现短信接口的操作类
Ø 属性:短信接口实现类可以自定义一些属性值
Ø 值:对属性赋值
**

第六部分 组织架构同步接口

一、 接口说明

该接口用来操作系统中的组织架构,可以实时的把e-cology系统中的有变化的组织架构同步到第三方系统,也可以通过定时的方式把第三方系统的组织架构同步到e-cology

二、 使用说明

1. 自定义接口

组织架构同步操作需要用开发人员实现e-cology提供的接口,接口类为:weaver.interfaces.hrm.HrmSynService,接口定义如下:

package weaver.interfaces.hrm;

publicinterface HrmSynService {

/
定时同步分部
从其他系统同步到OA
*/
public String SynTimingToOASubCompany();

/

定时同步部门
从其他系统同步到OA
/
public String SynTimingToOADepartment();

/**
定时同步岗位
从其他系统同步到OA
/
public String SynTimingToOAJobtitle();

/
定时同步人员
从其他系统同步到OA
*/
public String SynTimingToOAHrmResource();

/

定时同步分部
从OA同步到其他系统
/
publicvoid SynTimingFromOASubCompany(SubCompanyBean[] subcompanybeanlist);

/**
定时同步部门
从OA同步到其他系统
/
publicvoid SynTimingFromOADepartment(DepartmentBean[] departmentbeanlist);

/
定时同步岗位
从OA同步到其他系统
*/
publicvoid SynTimingFromOAJobtitle(JobTitleBean[] jobtitlebeanlist);

/

定时同步人员
从OA同步到其他系统
/
publicvoid SynTimingFromOAHrmResource(UserBean[] userbeanlist);

/**
即时同步分部(从OA同步单条数据到第三方系统中)
@param subcompanybean
/
publicvoid SynInstantSubCompany(SubCompanyBean subcompanybean);

/
即时同步部门(从OA同步单条数据到第三方系统中)
@param departmentbean
*/
publicvoid SynInstantDepartment(DepartmentBean departmentbean);

/

即时同步岗位(从OA同步单条数据到第三方系统中)
@param jobtitlebean
/
publicvoid SynInstantJobtitle(JobTitleBean jobtitlebean);

/**
即时同步人员(从OA同步单条数据到第三方系统中)
@param userbean
/
publicvoid SynInstantHrmResource(UserBean userbean);

/
流程消息提醒
@param sender 发送者
*
@param receiver 接受者
*
@param title 标题
*
@param content 内容
*
@param url
*
@return
*/
publicboolean** SynSendMessage(String sender,String receiver,String title,String content,String url);
}

接口实现类示例:

package weaver.interfaces.hrm
publicclass HrmSynDAO extends BaseBean implements HrmSynService {

public String SynTimingToOASubCompany() {
String strxml = “<?xml version=\“1.0\“ encoding=\“UTF-8\“?>“ +
“ +
001测试分部一测试分部一00“ +
“ +
“ +
002测试分部二测试分部二01“ +
“ +
“ +
0031“ +
“;
return strxml;
}

public String SynTimingToOADepartment() {
String strxml = “<?xml version=\“1.0\“ encoding=\“UTF-8\“?>“ +
“ +
001测试部门一测试部门一00100“ +
“ +
“ +
002测试部门二测试部门二00201“ +
“ +
“;
return strxml;
}


public String SynTimingToOAJobtitle() {
String strxml = “<?xml version=\“1.0\“ encoding=\“UTF-8\“?>“ +
“ +
001测试岗位一测试岗位一001“ +
“ +
“;
return strxml;
}

public String SynTimingToOAHrmResource() {
String strxml = “<?xml version=\“1.0\“ encoding=\“UTF-8\“?>“ +
“ +
001测试人员001001“ +
“ +
“;
return strxml;
}

publicvoid SynTimingFromOASubCompany(SubCompanyBean[] subcompanybeanlist) {
for(int i=0; i String code = subcompanybeanlist[i].getcode(); //分部编码
String shortname = subcompanybeanlist[i].get_shortname(); //分部简称
String fullname = subcompanybeanlist[i].get_fullname(); //分部全称
String parentcode = subcompanybeanlist[i].get_parentcode(); //上级分部编码
String showorder = subcompanybeanlist[i].get_showorder(); //显示顺序
String canceled = subcompanybeanlist[i].get_canceled(); //0:正常,1:封存
String id = subcompanybeanlist[i].get_subcompanyid(); //分部ID

//得到上面值之后可以根据需求把值传到第三方系统里面,怎样同步过去,下面的代码就需要自己去编写
}
}

publicvoid SynTimingFromOADepartment(DepartmentBean[] departmentbeanlist) {
for(int i=0; i String code = departmentbeanlist[i].get_code(); //部门编码
String shortname = departmentbeanlist[i].get_shortname(); //部门简称
String fullname = departmentbeanlist[i].get_fullname(); //部门全称
String parentcode = departmentbeanlist[i].getParent_code(); //所属分部编码
String subcompanycode = departmentbeanlist[i].getSubcompany_code(); //所属分部编码
String showorder = departmentbeanlist[i].get_showorder(); //显示顺序
String canceled = departmentbeanlist[i].get_canceled(); //0:正常,1:封存
String id = departmentbeanlist[i].get_departmentid(); //部门ID

System._out
.println(“shortname:”+shortname);

//得到上面值之后可以根据需求把值传到第三方系统里面,怎样同步过去,下面的代码就需要自己去编写
}
}

publicvoid SynTimingFromOAJobtitle(JobTitleBean[] jobtitlebeanlist) {
for(int i=0; i String code = jobtitlebeanlist[i].get_code(); //岗位编码
String deptcode = jobtitlebeanlist[i].get_departmentcode(); //部门简称
String shortname = jobtitlebeanlist[i].get_shortname(); //岗位简称
String fullname = jobtitlebeanlist[i].get_fullname(); //岗位全称
String id = jobtitlebeanlist[i].get_jobtitleid(); //岗位id

//得到上面值之后可以根据需求把值传到第三方系统里面,怎样同步过去,下面的代码就需要自己去编写
}
}

publicvoid SynTimingFromOAHrmResource(UserBean[] userbeanlist) {
for(int i=0; i String lastname = userbeanlist[i].getLastname();
String loginid = userbeanlist[i].getLoginid();
String sex = userbeanlist[i].getSex();
String telephone = userbeanlist[i].getTelephone();
String mobile = userbeanlist[i].getMobile();
String email = userbeanlist[i].getEmail();
String startdate = userbeanlist[i].getStartdate();
String enddate = userbeanlist[i].getEnddate();
String jobtitle = userbeanlist[i].getJobtitle();
String seclevel = userbeanlist[i].getSeclevel();
String subcompanyid1 = userbeanlist[i].getSubcompanyid1();
String departmentid = userbeanlist[i].getDepartmentid();
String managerid = userbeanlist[i].getManagerid();
String certificatenum = userbeanlist[i].getCertificatenum();
String workcode = userbeanlist[i].getWorkcode();
String status = userbeanlist[i].getStatus();
String birthday = userbeanlist[i].getBirthday();
String createdate = userbeanlist[i].getCreatedate();
String lastmoddate = userbeanlist[i].getLastChangdate();

//得到上面值之后可以根据需求把值传到第三方系统里面,怎样同步过去,下面的代码就需要自己去编写
}
}

publicvoid SynInstantSubCompany(SubCompanyBean subcompanybean) {
String code = subcompanybean.get_code(); //分部编码
String shortname = subcompanybean.get_shortname(); //分部简称
String fullname = subcompanybean.get_fullname(); //分部全称
String parentcode = subcompanybean.get_parentcode(); //上级分部编码
String showorder = subcompanybean.get_showorder(); //显示顺序
String canceled = subcompanybean.get_canceled(); //0:正常,1:封存
String id = subcompanybean.get_subcompanyid(); //分部ID
}

publicvoid SynInstantDepartment(DepartmentBean departmentbean) {
String code = departmentbean.get_code(); //部门编码
String shortname = departmentbean.get_shortname(); //部门简称
String fullname = departmentbean.get_fullname(); //部门全称
String parentcode = departmentbean.getParent_code(); //所属分部编码
String subcompanycode = departmentbean.getSubcompany_code(); //所属分部编码
String showorder = departmentbean.get_showorder(); //显示顺序
String canceled = departmentbean.get_canceled(); //0:正常,1:封存
String id = departmentbean.get_departmentid(); //部门ID
}

publicvoid SynInstantJobtitle(JobTitleBean jobtitlebean) {
String code = jobtitlebean.get_code(); //岗位编码
String deptcode = jobtitlebean.get_departmentcode(); //部门简称
String shortname = jobtitlebean.get_shortname(); //岗位简称
String fullname = jobtitlebean.get_fullname(); //岗位全称
String id = jobtitlebean.get_jobtitleid(); //岗位id
}

publicvoid SynInstantHrmResource(UserBean userbean) {
String lastname = userbean.getLastname();
String loginid = userbean.getLoginid();
String sex = userbean.getSex();
String telephone = userbean.getTelephone();
String mobile = userbean.getMobile();
String email = userbean.getEmail();
String startdate = userbean.getStartdate();
String enddate = userbean.getEnddate();
String jobtitle = userbean.getJobtitle();
String seclevel = userbean.getSeclevel();
String subcompanyid1 = userbean.getSubcompanyid1();
String departmentid = userbean.getDepartmentid();
String managerid = userbean.getManagerid();
String certificatenum = userbean.getCertificatenum();
String workcode = userbean.getWorkcode();
String status = userbean.getStatus();
String birthday = userbean.getBirthday();
String createdate = userbean.getCreatedate();
String lastmoddate = userbean.getLastChangdate();
}

publicboolean SynSendMessage(String sender, String receiver, String title,String content, String url) {
returnfalse;
}
}

接口方法实现说明:
以下四个方法是从第三方系统同步到OA系统接口,返回的数据格式一定要按照下面示例中的格式去封装数据,否则会无法同步数据。

/
定时同步分部
从其他系统同步到OA
*/
public String SynTimingToOASubCompany();

/

定时同步部门
从其他系统同步到OA
/
public String SynTimingToOADepartment();

/**
定时同步岗位
从其他系统同步到OA
/
public String SynTimingToOAJobtitle();

/
定时同步人员
从其他系统同步到OA
*/
public** String SynTimingToOAHrmResource();

Ø SynTimingToOASubCompany():从第三方系统同步到OA时只需要把数据封装成一个xml字符串,格式如下(一定要按照此格式):

<?xml version=”1.0” encoding=”UTF-8”?>



001
测试分部一
测试分部一
0
0


002
测试分部二
测试分部二
0
1


003
1


相关属性说明:
Action:动作,add:添加,edit:编辑,delete:删除,OA中只做封存和解封,canceled=1封存,canceled=0解封
Code:分部编码,唯一值
Shortname:分部简称
Fullname:分部全称
Parent_code:上级分部编码,没有上级请填写0
Order:排序值
Ø SynTimingToOADepartment():从第三方系统同步到OA时只需要把数据封装成一个xml字符串,格式如下(一定要按照此格式):

<?xml version=”1.0” encoding=”UTF-8”?>



0001
测试部门一
测试部门一
001
0
0


0002
测试部门二
测试部门二
003
0
1


0003
1



相关属性说明:
Action:动作,add:添加,edit:编辑,delete:删除,OA中只做封存和解封,canceled=1封存,canceled=0解封
Code:部门编码,唯一值
Shortname:部门简称
Fullname:部门全称
Org_code:分部编码
Parent_code:上级部门编码,没有上级请填写0
Order:排序值

Ø SynTimingToOAJobtitle():从第三方系统同步到OA时只需要把数据封装成一个xml字符串,格式如下(一定要按照此格式):

<?xml version=”1.0” encoding=”UTF-8”?>



00001
测试岗位一
测试岗位一
0001


00002
测试岗位二
测试岗位二
0002


00003
测试岗位三


相关属性说明:
Action:动作,add:添加,edit:编辑,delete:删除
Jobtitlecode:岗位编码,唯一值
Jobtitlename:岗位简称
Jobtitleremark:岗位全称
Org_code:分部编码
Jobtitledept:岗位所属部门编码
Ø SynTimingToOAHrmResource():从第三方系统同步到OA时只需要把数据封装成一个xml字符串,格式如下(一定要按照此格式):

<?xml version=”1.0” encoding=”UTF-8”?>



10001
test
test
123456
001</ departmentcode >
001</ jobtitlecode >
1
10000</ managercode >
1
1988-09-09
12345678
12345678
test@163.com</email>
1988-09-09</startdate>
1988-09-09
111111111


10001
test
test
123456
001</ departmentcode >
001</ jobtitlecode >
1
10000</ managercode >
1
1988-09-09
12345678
12345678
test@163.com</email>
1988-09-09</startdate>
1988-09-09
111111111


相关属性说明:
Action:动作,add:添加,edit:编辑
Workcode:人员编码,唯一值
Departmentcode:部门编码
Lastname:姓名
Loginid:登录名
Password:密码(明码)
Seclevel:安全级别
Sex:性别,1:女,0:男
Jobtitlecode:岗位编码
Managercode:直接上级(编码)
Status:状态,0:试用、1:正式、2:临时、3:试用延期、4:解聘、5:离职、6:退休、7:无效
Telephone:办公电话
Mobile:移动电话
Fax:传真
Email:邮箱
Birthday:出生日期
Startdate:合同开始日期
Enddate:合同结束日期
Certificatenum:身份证

以下八个接口实现的是从OA同步到第三方系统,每个方法相对应的传入了分部,部门,岗位,人员数组,根据实际业务需求获取相关数据,方法后面会提供每个数据对象的属性说明。

| /
定时同步分部
从OA同步到其他系统
*/
publicvoid SynTimingFromOASubCompany(SubCompanyBean[] subcompanybeanlist);

/

定时同步部门
从OA同步到其他系统
/
publicvoid SynTimingFromOADepartment(DepartmentBean[] departmentbeanlist);

/**
定时同步岗位
从OA同步到其他系统
/
publicvoid SynTimingFromOAJobtitle(JobTitleBean[] jobtitlebeanlist);

/
定时同步人员
从OA同步到其他系统
*/
publicvoid SynTimingFromOAHrmResource(UserBean[] userbeanlist);
/

即时同步分部(从OA同步单条数据到第三方系统中)
**
@param subcompanybean
*/
publicvoid SynInstantSubCompany(SubCompanyBean subcompanybean);

/

即时同步部门(从OA同步单条数据到第三方系统中)
**
@param departmentbean
*/
publicvoid SynInstantDepartment(DepartmentBean departmentbean);

/

即时同步岗位(从OA同步单条数据到第三方系统中)
**
@param jobtitlebean
*/
publicvoid SynInstantJobtitle(JobTitleBean jobtitlebean);

/

即时同步人员(从OA同步单条数据到第三方系统中)
**
@param userbean
*/
publicvoid** SynInstantHrmResource(UserBean userbean);

| | —- |

Ø SubCompanyBean.java字段说明

/
分部id
/
private String _subcompanyid;

/

简称
/
private String _shortname;

/
全称
/
private String _fullname;

/

上级分部id
/
private String _supsubcompanyid;

/
上级分部编码
/
private String _parentcode;

/

显示顺序
/
private String _showorder;

/
分部编码
/
private String _code;

/

是否封存
0和null表示是正常,1:表示封存
/
private String _canceled;

private String action = “”; //行为

*private
String lastChangdate = “”; //最后修改日期

Ø DepartmentBean.java字段说明

/
部门id
/
private String _departmentid;

/

简称
/
private String _shortname;

/
全称
/
private String _fullname;

/

所属分部id
/
private String _subcompanyid;

/
上级部门id
/
private String _supdepartmentid;

/

显示顺序
/
private String _showorder;

/
部门编码
/
private String _code;

/

上级部门编码
/
private String parent_code;

/
是否封存
0和null表示是正常,1:表示封存
*/
private String _canceled;

/

分部编码
/
private String subcompany_code;

private String action = “”; //行为

private String lastChangdate = “”; //最后修改日期

Ø JobTitleBean.java字段说明:

private String action;

/
岗位id
/
private String _code;

/

岗位id
/
private String _jobtitleid;

/
简称
/
private String _shortname;

/

全称
/
private String _fullname;

/
所属部门id
/
private String _departmentid;

/

所属部门编码
/
private String _departmentcode;


/
备注
/
private String _jobtitleremark;

private** String _lastChangdate = “”; //最后修改日期

Ø UserBean.java字段说明:

privateintuserid ; //用户id

private String subcompanyid1; //分部id

private String departmentid; //部门id

private String subcompanyname; //分部名称

private String departmentname; //部门名称

private String subcompanycode; //分部编码

private String departmentcode; //部门编码

private String jobtitlecode; //岗位编码

private String workcode; //编号

private String lastname; //姓名

private String loginid; //系统账号

private String password; //密码

private String seclevel; //安全级别

private String sex; //性别

private String jobtitle; //岗位

private String managerid; //直接上级

private String managercode; //直接编码

private String status; //状态

private String telephone; //办公电话

private String mobile; //移动电话

private String fax; //传真

private String certificatenum; //身份证

private String email; //电子邮件

private String systemlanguage; //系统语言默认7

private String birthday; //生日

private String startdate = “” ; //合同开始日期

private String enddate = “” ; //合同结束日期

private String createdate=””; //创建日期

private String lastChangdate=””; //最后修改日期

private String action=””;


2. 接口配置说明

2.1定时同步
Ecology系统会定时调用接口中的SynTimingToOASubCompany,SynTimingToOADepartment,SynTimingToOAJobtitle,SynTimingToOAHrmResource,SynTimingFromOASubCompany,SynTimingFromOADepartment,SynTimingFromOAJobtitle,SynTimingFromOAHrmResource这八个方法的,假设这八个方法体中为空也不影响程序正常运行,前面四个是第三方系统的组织架构同步到OA,后面四个是OA的组织架构同步到第三方系统,用户请根据自身的需求去实现其中的方法

2.2实时同步
Ecology系统会在维护分部,部门,岗位,人员时自动调用SynInstantSubCompany,SynInstantDepartment,SynInstantJobtitle,SynInstantHrmResource即时同步的的方法,以上四个方法中可以传入的SubCompanyBean,DepartmentBean,JobTitleBean,UserBean对象获取相应的值,action是操作类型,1:表示新增,2:编辑,3:删除,可以根据action做相应的处理,只要实现了以上方法,在OA中对分部,部门,岗位,人员做相应的操作会即时调用以上方法去做同步,如果以上四个方法体都为空也不会影响OA的正常操作。
2.3组织架构部署
修改\ecology\WEB-INF\service\hrmsyn.xml,以上面的接口实现类为例:








注意:红色部分表示是用户自己写得实现类,根据实际情况进行替换。
2.4定时同步任务部署
2.4.1 菜单入口
【后端】->【集成中心】à【计划任务】
2.4.2 操作界面
填写内容说明:
Ø 计划任务标识:hrmsyntask
Ø 计划任务类:weaver.interfaces.hrm.HrmSynTask
Ø 定时时间:时间为Cron表达式,根据实际需要进行同步的频率进行设置,
Ø 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个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”

第七部分 流程自定义页面接口

一、 接口说明

可以针对每个流程的workflowid,增加一个自定义页面,这个自定义页面不能添加显示流程内容,因为这个页面只能通过写js代码去修改流程页面的值。

二、 实现方法&步骤

1. 自定义页面代码示例

1.1 PC端

<%@pagelanguage=“java”_contentType=“text/html; charset=UTF-8”%>
<%@includefile=
“/systeminfo/initwev8.jsp”%>

<%
int requestid = Util.getIntValue(request.getParameter(“requestid”));//请求id
int workflowid = Util.getIntValue(request.getParameter(“workflowid”));//流程id
int formid = Util.getIntValue(request.getParameter(“formid”));//表单id
int isbill = Util.getIntValue(request.getParameter(“isbill”));//表单类型,1单据,0表单
int nodeid = Util.getIntValue(request.getParameter(“nodeid”));//流程的节点id
%>


jQuery(document).ready(function(){
//业务逻辑代码


});

1.2 Mobile端

<%@pagelanguage=“java”_contentType=“text/html; charset=UTF-8”pageEncoding=“UTF-8”%>
<%@pageimport=
“weaver.general.Util,weaver.hrm.common.,weaver.conn.,weaver.systeminfo.%>
<%@pageimport=
“weaver.hrm.attendance.domain.
,weaver.hrm.User,weaver.hrm.HrmUserVarify”%>
<%
User user = HrmUserVarify.getUser(request, response) ;
if(user == null){
response.sendRedirect(“/notice/noright.jsp”) ;
return ;
}
int nodeid = Util.getIntValue(request.getParameter(“nodeid”), 0);
int requestid = Util.getIntValue(request.getParameter(“requestid”), 0);
int workflowid = Util.getIntValue(request.getParameter(“workflowid”), 0);
int userid = Util.getIntValue(request.getParameter(“userid”));

%>
<scriptlanguage=
“javascript”_>
jQuery(document).ready(function(){
//业务处理

});

2. 配置自定义页面

在数据里面执行sql:

Pc端设置sql:
update workflow_base set custompage = ‘/test.jsp’ where id = 1000000
mobile端sql:
update workflow_base set custompage4emoble = ‘/testmobile.jsp ‘ where id = 1000000

说明:
Ø /test.jsp 为自定义页面的完整路径和文件名
Ø 1000000 为流程的路径ID

第八部分 流程提交前执行自定义函数

一. 接口说明

针对html模式的流程,可以在流程提交前执行一个自定义函数,这个函数是通过重写checkCustomize这个函数来实现的。
手机端也有类似的方法,方法名为:dobeforecheck

二. 实现方法&步骤

1. PC端在html模板里面加入如下代码就行

2. mobile端在html模板里面加入如下代码就行

**

第九部分 如何启用系统的WebService接口

一、 启用Ecology系统WebService接口

  1. 修改\ecology\WEB-INF\web.xml文件,在相应处增加servlet部署(参考系统中已有很多servlet部署),加入如下描述

XFireServlet
XFireServlet
org.codehaus.xfire.transport.http.XFireConfigurableServlet


XFireServlet
/services/*

注意:不要添加在注释中(即以“<!—”开始至“—>”结束为注释)!

**

第十部分 文档webservices接口

一、 接口说明

可以通过该接口对系统中的文档进行一些操作,创建文档、删除文档、更新文档、查看文档

二、 使用说明

  1. 文档WebService接口部署
    Ø 打开/Ecology/classbean/META-INF/xfire/services.xml
    Ø 在services.xml里面检查是否有以下代码,没有则添加:

DocService
http://localhost/services/DocService
weaver.docs.webservices.DocService
weaver.docs.webservices.DocServiceImpl
org.codehaus.xfire.annotations.AnnotationServiceFactory

Ø 添加完成上面的代码后,重启服务,然后再浏览器的地址栏中输入输入下面的地址看是否部署成功,地址为:http://OA地址/services/DocService?wsdl
如果部署成功则可以看到如下内容:

  1. 接口方法概述
名称 参数 返回值 功能描述
login String loginid:用户登陆名
String password :用户登陆密码
int logintype:登陆方式(0 数据库验证;1 动态密码验证;2 LDAP验证)
String ipaddress:用户IP地址
String:登陆Session码 登陆验证用户,并根据返回随Session码
createDoc DocInfo docinfo:文档信息对象
String sessioncode:登陆Session码
int:1 成功 0 失败 根据文档对象创建文档
updateDoc DocInfo docinfo:文档信息对象
String sessioncode:登陆Session码
int:1 成功 0 失败 根据文档对象修改文档
deleteDoc int id:文档ID
String sessioncode:登陆Session码
int:1 成功 0 失败 根据文档ID删除文档
getDoc int id:文档ID
String sessioncode:登陆Session码
DocInfo:文档对象 根据文档ID取得文档对象(带文档内容及附件)
getDocCount String sessioncode:登陆Session码 int:文档数 取得有权限访问的文档数
getList String sessioncode:登陆Session码 DocInfo[]:文档对象数组 取得有权限访问的文档对象数组(无文档内容及附件)
  1. 文档对象说明
    Ø DocInfo
/
文档ID
/
privateintid;

/

文档类型
1 Html文档 2 Office文档
/
privateintdocType;

/**
文档标题
/
private String docSubject;

/**
文档编号
/
private String docCode;

/**
新闻类型
/
privateintdocPublishType;
private String publishable;

/**
文档版本
/
privateintdocEdition;
privateintdocEditionId;
private String docEditionStr;

/**
文档状态
/
privateintdocStatus;
private String docStatusStr;

/**
主目录
/
privateintmaincategory;
private String maincategoryStr;

/**
分目录
/
privateintsubcategory;
private String subcategoryStr;

/**
子目录
/
privateintseccategory;
private String seccategoryStr;

/**
部门
/
privateintdocdepartmentid;
private String docdepartmentStr;

/**
语言
/
privateintdoclangurage;
private String doclangurageStr;

/**
关键字
/
private String keyword;

/**
创建
/
privateintdoccreaterid;
privateintdoccreatertype;
private String doccreatername;
private String doccreatedate;
private String doccreatetime;

/**
修改
/
privateintdoclastmoduserid;
privateintdoclastmodusertype;
private String doclastmodusername;
private String doclastmoddate;
private String doclastmodtime;

/**
批准
/
privateintdocapproveuserid;
privateintdocapproveusertype;
private String docapproveusername;
private String docapprovedate;
private String docapprovetime;

/**
失效
/
privateintdocinvaluserid;
privateintdocinvalusertype;
private String docinvalusername;
private String docinvaldate;
private String docinvaltime;

/**
归档
/
privateintdocarchiveuserid;
privateintdocarchiveusertype;
private String docarchiveusername;
private String docarchivedate;
private String docarchivetime;

/**
作废
/
privateintdoccanceluserid;
privateintdoccancelusertype;
private String doccancelusername;
private String doccanceldate;
private String doccanceltime;

/**
主文档
/
privateintmaindoc;
private String maindocname;

/**
被引用列表
/
privateint[] childdoc;
private String[] chiledocname;

/**
文档所有者
/
privateintownerid;
privateintownertype;
private String ownername;

/**
失效时间
/
private String invalidationdate;

/**
虚拟目录
/
privateint[] dummyIds;
private String[] dummyNames;

/**
自定义字段
/
private DocCustomField[] doccustomfields;

/**
关联类型
/
privateinthrmresid;
privateintassetid;
privateintcrmid;
privateintitemid;
privateintprojectid;
privateintfinanceid;

/**
HTML文档内容
/
private String doccontent;

/**
Office文档内容
/
privateintimagefileId;
privateintversionId;

/**
是否回复文档
/
private String isreply;
privateintreplydocid;

/**
附件数
/
privateintaccessorycount;

/**
回复数
/
privateintreplaydoccount;

/**
文档附件
/
*private
DocAttachment[] attachments;

Ø DocCustomField

/
自定义字段ID
/
privateintfieldid;

/

自定义字段显示类型
/
private String fieldhtmltype;

/
自定义字段存储类型
/
private String fielddbtype;

/

自定义字段类型
/
privateintfieldtype;

/
自定义字段显示名称
/
private String fieldshow;

/

自定义字段值
/
private String fieldvalue;

Ø DocAttachment

/
文档ID
/
privateintdocid;

/

附件ID
/
privateintimagefileid;

/
附件名称
/
private String imagefilename;

/

附件描述
/
private String imagefiledesc;

/
附件宽度(图片文件)
/
privateintimagefilewidth;

/

附件高度(图片文件)
/
privateintimagefileheight;

/
附件大小
/
privateintimagefilesize;

/

附件类型
/
private String docfiletype;

/
附件版本
/
privateintversionId;

/

附件版本描述
/
private String versionDetail;

/
是否Office文档内容附件
/
private String isextfile;

/

文件名称
/
private String filename;

/
文件类型
/
private String filetype;

/

文件使用次数
/
privateintfileused;

/
文件绝对路径
/
private String filerealpath;

/

文件内容Base64后编码
/
private String filecontent;

/
是否压缩
/
privateint**iszip;
  1. 接口调用示例
    Ø 说明:示例代码通过生成客户端的方式进行调用,如何生成客户端代码,请参照文档最后的附录1
    Ø 生成客户端代码后,可以使用下面的代码进行测试:


import java.util.zip.ZipInputStream;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;

import org.apache.axis.encoding.Base64;

import weaver.docs.webservices.DocAttachment;
import weaver.docs.webservices.DocInfo;

import localhost.services.DocService.DocServiceLocator;
import localhost.services.DocService.DocServicePortType;

publicclass DocServiceTest {

privatestatic String serviceurl = “http://192.168.7.200:8080/services/DocService“;

privatestatic DocServicePortType service = null;

/
*
@param args
*/
publicstaticvoid main(String[] args) {
//
TODO Auto-generated method stub
try {
service =
new DocServiceLocator().getDocServiceHttpPort(new URL(serviceurl));

// 登陆
String loginid = “ca11”;
String password = “1”;
int logintype = 0;
String ip = “127.0.0.1”;
String session = getSession(loginid,password,logintype,ip);
System.out.println(session);

// //获得有权限的文档数
// getDocCount(session);
//
// //获得有权限的文档列表
// int page = 1;//第几页
// intpagesize = 5;//每页几条记录
// getDocList(session,page,pagesize);
//
// //获得指定文档的相关信息
int docid = 32194;
// getDocInfo(session,docid);
//
// //更新指定文档的信息
docid = 32194;
updateDocInfo(session,docid);
//
// //删除文档
docid = 32202;
deleteDoc(session,docid);
//
// //创建文档
// createNewDoc(session);

}
catch (Exception e) {
e.printStackTrace();
}
}

/

验证登陆
@return session
@throws MalformedURLException
@throws ServiceException
@throws RemoteException
/
publicstatic String getSession(String loginid,String password,int logintype,String ip) throws MalformedURLException, ServiceException, RemoteException{
// 登陆
String session = service.login(loginid, password, logintype, ip);//用户名,密码,登陆方式(0 数据库验证;1 动态密码验证;2 LDAP验证),ip

return session;
}

/
获得有权限的文档数
@param session 登陆的session
*
@throws MalformedURLException
*
@throws ServiceException
*
@throws RemoteException
*/
publicstaticvoid getDocCount(String session) throws MalformedURLException, ServiceException, RemoteException{
// 取得有权限访问的文档数
int count = service.getDocCount(session);
System.out.println(“文档数:”+count);
}

/

获得有权限的文档列表
@param session 登陆的session
@param page 第几页
@param pagesize 每页记录数
@throws RemoteException
/
publicstaticvoid getDocList(String session,int page,int pagesize) throws RemoteException{
// 取得有权限访问的文档列表,第1页,每页10条记录
DocInfo[] docs1 = service.getList(session, page, pagesize);
// 取得有权限访问的文档列表,第2页,每页10条记录
// DocInfo[] docs2 = service.getList(session, 2, 5);
// 循环打印取得的文档的ID、标题、主目录ID、主目录名称、分目录ID、分目录名称、
// 子目录ID、子目录名称、文档创建人ID、文档创建人名称、创建日期、创建时间
for (int i = 0; i < docs1.length; i++){
System.out.println(docs1[i].getId() + “|”
+ docs1[i].getDocSubject() + “|”
+ docs1[i].getMaincategory() + “|”
+ docs1[i].getMaincategoryStr() + “|”
+ docs1[i].getSubcategory() + “|”
+ docs1[i].getSubcategoryStr() + “|”
+ docs1[i].getSeccategory() + “|”
+ docs1[i].getSeccategoryStr() + “|”
+ docs1[i].getDoccreaterid() + “|”
+ docs1[i].getDoccreatername() + “|”
+ docs1[i].getDoccreatedate() + “|”
+ docs1[i].getDoccreatetime());
}
}

/
根据文档的id获得指定文档的相关信息
@param session 登陆session
*
@param docid 文档id
*
@throws RemoteException
*/
publicstaticvoid getDocInfo(String session,int docid) throws RemoteException{
// 根据ID取得文档内容,docid为文档的id
DocInfo doc = service.getDoc(docid, session);

System.out.println(“文档信息:\n”);
System.out.println(doc.getMaincategory()+” “+doc.getMaincategoryStr());
System.out.println(doc.getSubcategory()+””+doc.getSubcategoryStr());
System.out.println(doc.getSeccategory()+””+doc.getSeccategoryStr());


// 取得该文档的第一个附件
DocAttachment da = doc.getAttachments()[0];
System.out.println(“doc.getAttachments():”+doc.getAttachments().length);
// 得到附件内容
byte[] content = Base64.decode(da.getFilecontent());
System.out.println(“da.getFilecontent():”+da.getFilecontent());
System.out.println(“content:”+content.length);
// 得到附件在服务器上的绝对路径
String filepath = da.getFilerealpath();
System.out.println(“附件信息:\n”);
System.out.println(filepath);
System.out.println(da.getFilename());
System.out.println(“da.getIszip():\n”+da.getIszip());


// 将附件内容转存至D:\
File file =
new File(“d:\\“ + da.getFilename());
try {
int byteread;
byte data[] = newbyte[1024];
InputStream imagefile =
null;
// if (da.getIszip() == 1) {
// ZipInputStream zin = new ZipInputStream(
// new ByteArrayInputStream(content));
// if (zin.getNextEntry() != null)
// imagefile = new BufferedInputStream(zin);
// } else {
imagefile =
new ByteArrayInputStream(content);
// }
OutputStream out =
new FileOutputStream(file);
while ((byteread = imagefile.read(data)) != -1) {
out.write(data, 0, byteread);
out.flush();
}
imagefile.close();
out.close();
}
catch (Exception e) {
e.printStackTrace();
}

}

/

创建新文档
@param session 登陆session
@throws RemoteException
/
publicstaticvoid createNewDoc(String session) throws RemoteException{
byte[] content = newbyte[102400];
// 上传附件,创建html文档
content = null;
try {
int byteread;
byte data[] = newbyte[1024];
InputStream input = new FileInputStream(new File(“d:\\service test.doc”));

ByteArrayOutputStream out = new ByteArrayOutputStream();
while ((byteread = input.read(data)) != -1) {
out.write(data, 0, byteread);
out.flush();
}
content = out.toByteArray();
input.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
DocAttachment da = new DocAttachment();
da.setDocid(0);
da.setImagefileid(0);
da.setFilecontent(Base64.encode(content));
da.setFilerealpath(“d:\\service test.doc”);
da.setIszip(1);
da.setFilename(“service test.doc”);
da.setIsextfile(“1”);
da.setDocfiletype(“3”);

DocInfo doc = new DocInfo();//创建文档
doc.setDoccreaterid(111);//
doc.setDoccreatertype(0);
doc.setAccessorycount(1);
doc.setMaincategory(38);//主目录id
doc.setSubcategory(53);//分目录id
doc.setSeccategory(204);//子目录id
doc.setOwnerid(111);
doc.setDocStatus(1);
doc.setId(0);
doc.setDocType(2);
doc.setDocSubject(“service html 文档”);
doc.setDoccontent(“service html 文档 content 22222”);
doc.setAttachments(new DocAttachment[] { da });
System.out.println(“”);
System.out.println(“新文档id:”+service.createDoc(doc, session));
}

/
更新文档的相关信息
@param session 登陆session
*
@param docid 文档id
*
@throws RemoteException
*/
publicstaticvoid updateDocInfo(String session,int docid) throws RemoteException{
// 根据ID取得文档内容,docid为文档的id
DocInfo doc = service.getDoc(docid, session);
System.out.println(“doc.getDocStatus():”+doc.getDocStatus());
System.out.println(“doc.getSeccategory():”+doc.getSeccategory());

// 取得该文档的第一个附件
DocAttachment da = doc.getAttachments()[0];
// 得到附件内容
byte[] content = Base64.decode(da.getFilecontent());
// 得到附件在服务器上的绝对路径
// String filepath = da.getFilerealpath();

// 上传附件,更新文档
content =
null;
try {
int byteread;
byte data[] = newbyte[1024];
InputStream input =
new FileInputStream(new File(“d:\\20130903018.png”));

ByteArrayOutputStream out =
new ByteArrayOutputStream();
while ((byteread = input.read(data)) != -1) {
out.write(data, 0, byteread);
out.flush();
}
content = out.toByteArray();
input.close();
out.close();
}
catch (Exception e) {
e.printStackTrace();
}
da.setDocid(doc.getId());
da.setImagefileid(0);
da.setFilecontent(Base64.encode(content));
da.setFilerealpath(“d:\\20130903018.png”);
da.setIszip(1);
da.setFilename(“20130903018.png”);
System.out.println(“insert::”+(da!=
null&&((da.getFilecontent()!=null&&!””.equals(da.getFilecontent()))||(da.getFilerealpath()!=null&&!””.equals(da.getFilerealpath())))));


doc.setDocSubject(“test”);
doc.setDoccontent(“content”);
doc.setAttachments(
new DocAttachment[] { da });
int result = service.updateDoc(doc, session);
System.out.println(“updateDocInfo:”+result);
}

/

删除文档
@param session 登陆session
@param docid 文档id
@throws RemoteException
/
publicstaticvoid deleteDoc(String session,int docid) throws RemoteException{
try{
//1删除成功,0删除失败
int result = service.deleteDoc(docid, session);
System.out.println(“result:”+result);
}*catch
(Exception e){
//异常,文档不存在
}
}

}

**

第十一部分 工作流程webservices接口

一、 接口说明

可以通过该接口对系统中的流程进行操作。具体方法见下面的使用说明。

二、 使用说明

1、流程WebService接口部署
Ø 打开/Ecology/classbean/META-INF/xfire/services.xml
Ø 在services.xml里面检查是否有以下代码,没有则添加:


WorkflowService
webservices.services.weaver.com.cn
weaver.workflow.webservices.WorkflowService
weaver.workflow.webservices.WorkflowServiceImpl
org.codehaus.xfire.annotations.AnnotationServiceFactory

说明:上面这个接口没有权限验证,以及客户端访问控制,如果需要进行权限控制,则需要配置下面的代码,推荐都使用下面的接口:


WorkflowService
webservices.services.weaver.com.cn
weaver.workflow.webservices.WorkflowService
weaver.workflow.webservices.WorkflowServiceImplSec
org.codehaus.xfire.annotations.AnnotationServiceFactory

使用上面接口,还需要在/Ecology/WEB-INF/web.xml配置以下内容,注意在web.xml里面的位置要配置在XFireServlet的位置之前


intsecurity
weaver.filter.IntefaceSecurityFilter


intsecurity
/services/*

配置允许访问WebService权限列表,页面地址为:/workflow/UserList.jsp,操作界面如下:

Ø 添加完成上面的代码后,重启服务,然后再浏览器的地址栏中输入输入下面的地址看是否部署成功,地址为:http://OA地址/services/ WorkflowService?wsdl
如果部署成功则可以看到如下内容:

2、接口说明

接口名称 参数说明 返回值 功能描述
创建新流程:
doCreateWorkflowRequest
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 recordCount:
总行数
int userId:
用户id
String[] conditions:
查询流程的条件,为字符串数组类型
WorkflowRequestInfo []:请求基本信息列表 根据参数条件获取需处理任务列表
排除创建节点任务
流程提交:
submitWorkflowRequest
WorkflowRequestInfo request:
请求信息对象
int requestid:
请求id
int userid:
提交人ID
String type:
类型
String remark:
提交意见
Boolean:
True 成功
False 失败
流程提交
流程退回:
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
返回数目

所有可用流程列表
getAllWorkflowRequestList
int pageNo:
当前页数
int pageSize:
每页的分页数量
int recordCount:
总行数
int userId:
用户id
String[] conditions:
查询流程的条件,为字符串数组类型
WorkflowRequestInfo []:请求基本信息列表 根据参数条件获取可用任务列表
得到所有抄送的流程数量
getCCWorkflowRequestCount
Int userid:
用户id
String[] conditions:
查询条件字符串数组
Int
返回数目

得到所有抄送流程列表
getCCWorkflowRequestList
int pageNo:
当前页数
int pageSize:
每页的分页数量
int recordCount:
总行数
int userId:
用户id
String[] conditions:
查询流程的条件,为字符串数组类型
WorkflowRequestInfo []:请求基本信息列表 根据参数条件获得抄送流程列表
得到可创建的工作流数量
getCreateWorkflowCount
Int userid:
用户id
String[] conditions:
查询条件字符串数组
Int
返回数目

取得可创建的工作流列表
getCreateWorkflowList
int pageNo:
当前页数
int pageSize:
每页的分页数量
int recordCount:
总行数
int userId:
用户id
String[] conditions:
查询流程的条件,为字符串数组类型
WorkflowBaseInfo []:流程基本信息列表 根据参数条件获得可创建流程列表
取得可创建的工作流类型数量
getCreateWorkflowTypeCount
Int userid:
用户id
String[] conditions:
查询条件字符串数组
Int
可创建的工作流类型数量

取得可创建的工作流类型列表
getCreateWorkflowTypeList
int pageNo:
当前页数
int pageSize:
每页的分页数量
int recordCount:
总行数
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 recordCount:
总行数
int userId:
用户id
String[] conditions:
查询流程的条件,为字符串数组类型
WorkflowRequestInfo []:请求基本信息列表 根据参数条件获得已办流程列表
取得已办工作流类型数量
getMyWorkflowRequestCount
Int userid:
用户id
String[] conditions:
查询条件字符串数组
Int:
我的请求流程数量

取得已办流程列表
getMyWorkflowRequestList
int pageNo:
当前页数
int pageSize:
每页的分页数量
int recordCount:
总行数
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 recordCount:
总行数
int userId:
用户id
String[] conditions:
查询流程的条件,为字符串数组类型
WorkflowRequestInfo []:请求基本信息列表 根据参数条件获得归档请求列表

3、接口对象说明
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;

4、JAVA代码调用示例.
1)创建流程

/
创建流程,支持多明细,并且带附件字段—目前只支持一个附件,并且是(http格式的)
@throws Exception
*/
publicstaticvoid 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);

}

2) 获取代办列表数量

/
获得代办事宜数量
@throws RemoteException
*/
publicstaticvoid 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);//获取待办事宜接口
}

3) 获得代办事宜列表

/
获得代办列表
/
publicstaticvoidgetDaiBanLieBiao() 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 wri = WorkflowRequestInfo[i];
System.out.println(wri.getCreatorId()+” “+wri.getCreatorName()+””+wri.getRequestName()+” “+wri.getCreateTime());
}
}

**

第十二部分 人力资源webservices接口

一、 接口说明

可以通过该接口对系统中的人员组织架构进行操作,也可以通过该接口读取系统中的组织架构。

二、 使用说明

  1. 人力资源WebService接口部署
    Ø 打开/Ecology/classbean/META-INF/xfire/services.xml
    Ø 在services.xml里面检查是否有以下代码,没有则添加:

HrmService
http://localhost/services/HrmService
weaver.hrm.webservice.HrmService
weaver.hrm.webservice.HrmServiceImpl
org.codehaus.xfire.annotations.AnnotationServiceFactory

Ø 添加完成上面的代码后,重启服务,然后再浏览器的地址栏中输入输入下面的地址看是否部署成功,地址为:http://OA地址/services/HrmService?wsdl
如果部署成功则可以看到如下内容:
Ø 调用接口的时候有个特别需要注意点:
接口部署成功之后,需要在OA的/Ecology/WEB-INF/prop/HrmWebserviceIP.properties配置文件中配置调用接口客户端的IP,调用接口时传入的参数ip包涵在此配置文件才能调用以下接口。
2. 接口方法概述

名称 参数 返回值 功能描述
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. 接口相关对象说明
    1)SynSubCompany 同步分部传入xml的格式如下(一定要按照此格式传入):
<?xml version=”1.0” encoding=”UTF-8”?>



001
测试分部一
测试分部一
0
0


002
测试分部二
测试分部二
0
1


003
1



相关属性说明:
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”?>



0001
测试部门一
测试部门一
001
0
0


0002
测试部门二
测试部门二
003
0
1


0003
1



相关属性说明:
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”?>



00001
测试岗位一
测试岗位一
0001


00002
测试岗位二
测试岗位二
0002


00003
测试岗位三



相关属性说明:
Action:动作,add:添加,edit:编辑,delete:删除
Jobtitlecode:岗位编码,唯一值
Jobtitlename:岗位简称
Jobtitleremark:岗位全称
Org_code:分部编码
Jobtitledept:岗位所属部门编码

4)SynHrmResource同步人员传入xml的格式如下(一定要按照此格式传入):

<?xml version=”1.0” encoding=”UTF-8”?>



10001
test
test
123456
测试分部一
测试部门一
测试岗位一
正式
1024

1988-09-09
12345678
12345678
test@163.com
已婚


10001
test
test
123456
测试分部一
测试部门一
测试岗位一
正式
1024

1988-09-09
12345678
12345678
test@163.com
已婚



相关属性说明:
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

privateintuserid ; //用户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=””; //最后修改日期
privateintaccounttype; //账号类型
privateintdsporder; //显示顺序

以上是获得用户的基本信息字段

  1. 示例程序
    Ø 说明:示例代码通过生成客户端的方式进行调用,如何生成客户端代码,请参照文档最后的附录1
    Ø 生成客户端代码后,可以使用下面的代码进行测试:


import weaver.hrm.webservice.DepartmentBean;
import localhost.services.HrmService.HrmServicePortTypeProxy;

publicclass HrmServiceTest {

privatestatic String ip = “192.168.7.200”;
privatestatic String url = “http://192.168.7.200:8080//services/HrmService“;

/
*
@param args
*/
publicstaticvoid main(String[] args) {
//
TODO Auto-generated method stub
try{
checkuser();//检查用户是否存在
getDepartmentInfo();//获得部门信息
synSubcompany();//同步分部
}
catch(Exception e){
e.printStackTrace();
}
}

/

同步分部
/
publicstaticvoid synSubcompany() throws Exception {
HrmServicePortTypeProxy service = new HrmServicePortTypeProxy(url);
String orgxml = “”;
StringBuffer sb = new StringBuffer();
sb.append(“<?xml version=\“1.0\“ encoding=\“UTF-8\“?>”);
sb.append(““);
sb.append(““);
sb.append(““);
sb.append(“service00111“);
sb.append(“测试分部一12“);
sb.append(“测试分部一12“);
sb.append(“service“);
sb.append(“0“);
sb.append(“
“);
sb.append(“
“);
sb.append(“
“);
orgxml = sb.toString();

sb = new StringBuffer();
sb.append(“<?xml version=\“1.0\“ encoding=\“UTF-8\“?>”);
sb.append(““);
sb.append(““);
sb.append(““);
sb.append(“service001“);
sb.append(“测试分部一yi“);
sb.append(“测试分部一yi“);
sb.append(“0“);
sb.append(“
“);
sb.append(“
“);
sb.append(“
“);
// orgxml = sb.toString();

System.out.println(service.synSubCompany(ip,orgxml));
}

/
获得部门信息
@throws Exception
*/
publicstaticvoid getDepartmentInfo() throws Exception {
HrmServicePortTypeProxy service =
new HrmServicePortTypeProxy(url);
DepartmentBean DepartmentBean[] = service.getHrmDepartmentInfo(ip, “1”);
System.out.println(DepartmentBean.length);
for(int i=0;i System.out.println(DepartmentBean[i].get_departmentid()+” “+ DepartmentBean[i].get_fullname());
}
}

/

检查用户是否存在
/
publicstaticvoid checkuser() throws Exception {
HrmServicePortTypeProxy service = new HrmServicePortTypeProxy(url);
System.out.println(service.checkUser(ip, “ca11”, “1”));
}
}

第十三部分 项目模块webservices接口

一、 接口说明

可以通过该接口在系统中创建项目、修改项目、查询项目、删除项目

二、 使用说明

  1. 项目WebService接口部署
    Ø 打开/Ecology/classbean/META-INF/xfire/services.xml
    Ø 在services.xml里面检查是否有以下代码,没有则添加:

ProjectService
webservices.prj.weaver.com.cn
weaver.pmp.ws.ProjectWs
weaver.pmp.ws.ProjectWs

Ø 添加完成上面的代码后,重启服务,然后再浏览器的地址栏中输入输入下面的地址看是否部署成功,地址为:http://OA地址/services/ ProjectService?wsdl
如果部署成功则可以看到如下内容:
2. 接口方法概述

名称 参数 返回值 功能描述
saveProject String prjXml:项目信息的xml 成功:返回项目信息,失败:返回失败原因 创建项目
updateProject String prjXml:项目信息的xml 成功:返回项目信息,失败:返回失败原因 更新项目
deleteProject String prjXml:项目信息的xml 成功:返回项目信息,失败:返回失败原因 删除项目
queryProject String prjXml:项目信息的xml 成功:返回项目信息,失败:返回失败原因 查询项目
  1. 接口相关对象说明
    1)传入xml的格式如下(一定要按照此格式传入):
<?xmlversion=“1.0”_encoding=“UTF-8”?>



zyt4
1



prjccww0002

test项目

项目类型AAA

工作类型AAA

zyt4,zyt2,zyt3

1



cj22



<a1label=
“其它信息1”>测试
<a2label=
“hello”>你好
<a3label=
“祝福”_>愿你天天好心情!

相关属性说明见注释

  1. 示例程序


import java.net.URL;

import org.codehaus.xfire.client.Client;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

publicclass ProjServiceTest {

privatestatic String url = “http://192.168.7.200:8080/services/ProjectService?wsdl";//webservice地址

publicstaticvoid main(String[] args) {
try {
ProjServiceTest t=new ProjServiceTest();
Document doc= DocumentHelper.createDocument();
Client client=new Client(new URL(url));
Object[] results = null;

doc= t.saveProjectXml(doc);
System.out.println(“result:\n”+ doc.asXML());
results = client.invoke(“saveProject”, new Object[] { doc.asXML() });//创建项目

doc = t.updateProjectXml(doc);
results = client.invoke(“updateProject”, new Object[] { doc.asXML() });//更新项目

doc = t.deleteProjectXml(doc);
results = client.invoke(“deleteProject”, new Object[] { doc.asXML() });//删除项目

doc = t.queryProjectXml(doc);
results = client.invoke(“queryProject”, new Object[] { doc.asXML() });//查询项目

if (results!=null) {//操作结果
System.out.println(“result:\n”+ results[0].toString());
}

} catch (Exception e) {
e.printStackTrace();
}
}

/
查询项目,只支持编号查询
@param doc
*
@return
*/
private Document queryProjectXml(Document doc){
Element rootElement= doc.addElement(“project”);
//用户权限信息
Element e= rootElement.addElement(“user”);
e.addElement(“loginid”).addText(“zyt4”);//人员编号
e.addElement(“password”).addText(“1”);//密码

//基本信息
e=rootElement.addElement(“base”);
e.addElement(“procode”).addText(“prjccww0002”);//项目编码

return doc;
}

/

删除项目,只支持通过编号进行查询
@param doc
@return
/
private Document deleteProjectXml(Document doc){
Element rootElement= doc.addElement(“project”);
//用户权限信息
Element e= rootElement.addElement(“user”);
e.addElement(“loginid”).addText(“zyt4”);//人员编号
e.addElement(“password”).addText(“1”);//密码

//基本信息
e=rootElement.addElement(“base”);
e.addElement(“procode”).addText(“prj0002”);//项目编码

return doc;
}

/
更新项目
@param doc
*
@return
*/
private Document updateProjectXml(Document doc){
Element rootElement= doc.addElement(“project”);
//用户权限信息
Element e= rootElement.addElement(“user”);
e.addElement(“loginid”).addText(“zyt4”);//人员编号
e.addElement(“password”).addText(“1”);//密码

//基本信息
e=rootElement.addElement(“base”);
e.addElement(“procode”).addText(“prjccww0002”);//项目编码
e.addElement(“name”).addText(“test项目update”);//项目名称
e.addElement(“prjtype”).addText(“项目类型AAA”);//项目类型
e.addElement(“worktype”).addText(“工作类型AAA”);//项目工作类型
e.addElement(“members”).addText(“zyt4,zyt2,zyt3”);//项目成员
e.addElement(“isblock”).addText(“1”);

//管理信息
e=rootElement.addElement(“manage”);
e.addElement(“manager”).addText(“cj22”);

return doc;
}

/

创建项目
@param doc
@return
/
private Document saveProjectXml(Document doc){
Element rootElement= doc.addElement(“project”);
//用户权限信息
Element e= rootElement.addElement(“user”);
e.addElement(“loginid”).addText(“zyt4”);//人员编号
e.addElement(“password”).addText(“1”);//密码

//基本信息
e=rootElement.addElement(“base”);
e.addElement(“procode”).addText(“prjccww0002”);
e.addElement(“name”).addText(“test项目”);
e.addElement(“prjtype”).addText(“项目类型AAA”);
e.addElement(“worktype”).addText(“工作类型AAA”);
e.addElement(“members”).addText(“zyt4,zyt2,zyt3”);
e.addElement(“isblock”).addText(“1”);

//管理信息
e=rootElement.addElement(“manage”);
e.addElement(“manager”).addText(“cj22”);

//其它信息
e=rootElement.addElement(“other”);
e.addElement(“a1”).addAttribute(“label”, “其它信息1”) .addText(“测试”);
e.addElement(“a2”).addAttribute(“label”, “hello”) .addText(“你好”);
e.addElement(“a3”).addAttribute(“label”, “祝福”) .addText(“愿你天天好心情!”);

return doc;
}

}

**

第十四部分 表单建模webservices接口

一、 接口说明

可以通过该接口对表单建模具体模块的数据进行增删改查的操作。

二、 使用说明

  1. 表单建模WebService接口部署
    Ø 打开/Ecology/classbean/META-INF/xfire/services.xml
    Ø 在services.xml里面检查是否有以下代码,没有则添加:

ModeDataService
http://localhost/services/ModeDataService
weaver.formmode.webservices.ModeDateService
weaver.formmode.webservices.ModeDataServiceImpl

Ø 添加完成上面的代码后,重启服务,然后再浏览器的地址栏中输入输入下面的地址看是否部署成功,地址为:http://OA地址/services/ ModeDataService?wsdl
如果部署成功则可以看到如下内容:
2. 接口方法概述

名称 参数 返回值 功能描述
saveModeData String paramXml:建模数据的xml String: 返回保存状态 保存表单数据(新增、更新)
getModeDataByID int modeId,int Id,int userId,String right,String isReturnDetail
参数说明:
modeId:表单ID
Id:数据ID
userId:用户ID
right:(y/n) 是否受权限控制
isReturnDetail:(y/n) 是否返回明细表数据
String: 表单内容 通过ID获取详细信息
getAllModeDataCount int modeId,int userId, String conditions,String right
参数说明:
modeId:表单ID
userId:用戶ID
conditions:查寻条件
right:(y/n) 是否受权限控制
int: 表单总数 跟据条件获取表单数据总数
getAllModeDataList int modeId,int pageNo,int pageSize,int recordCount,int userId, String conditions,String right,String isReturnDetail
参数说明:
modeId:表单ID
pageNo:当前页数
pageSize:每页记录数
recordCount:记录总数(小于等于0时自动计算记录总数)
userid:当前用户
conditions:查询条件
right:(y/n) 是否受权限控制
isReturnDetail:(y/n) 是否返回明细表数据
String: 表单数据列表(分页) 获取表单数据列表(分页)
deleteModeDataById int modeId,int Id,int userId,String right
参数说明:
modeId:表单ID
Id:数据ID
userId:用户ID
right:(y/n) 是否受权限控制
String: 返回删除状态 删除数据
  1. 示例程序
import java.rmi.RemoteException;

import localhost.services.ModeDateService.ModeDataServicePortTypeProxy;



publicclass CallModeDataSerivce {

private String url = “http://192.168.7.200:8080/services/ModeDataService“;

/
*
@param args
*
@throws RemoteException
*/
publicstaticvoid main(String[] args) throws RemoteException {
//
TODO Auto-generated method stub
CallModeDataSerivce c =
new CallModeDataSerivce();
c.addMoidfyModeData();
}

/

保存(新增、更新)
@throws RemoteException
/
publicvoid addMoidfyModeData() throws RemoteException{
ModeDataServicePortTypeProxy client= new ModeDataServicePortTypeProxy(url);
String modeid = “127”;
String khmc =”测试客户1231111”;
String dataid = “1”;
String xml = “<?xml version=\“1.0\“ encoding=\“UTF-8\“?>”;
xml +=”“;
xml +=”
“;
xml +=”1“;//用户id
xml +=”“+modeid+”“;//模块id
xml +=”“+dataid+”“;//billid如果是新增则值为空 如果有数据则为修改
xml +=”
“;
xml +=”“;
xml +=”“;
xml +=”Y“;//是否验证权限
xml +=”
“;
xml +=”“;
xml +=”“;
xml +=”“;
xml +=”name“;//数据库名称
xml +=”名称“;//字段名称
xml +=”varchar(256)“;//数据库类型
xml +=”“+khmc+”“;//字段的值
xml +=”名称“;
xml +=”
“;
xml +=”
“;
xml +=”“;
xml +=”
“;
xml +=”
“;
System.out.println(client.saveModeData(xml));
}

/**
删除表单数据
@throws RemoteException
/
publicvoid deleteModeDataService() throws RemoteException{
ModeDataServicePortTypeProxy client= new ModeDataServicePortTypeProxy(url);
/
@param modeId 表单ID
@param Id 数据ID
@param userId 用户ID
@param right (y/n)是否受权限控制
/
System.out.println(client.deleteModeDataById(127, 1, 1, “Y”));

}

/

获取表单数据总数
@throws RemoteException
/
publicvoid getAllModeDataCount() throws RemoteException{
ModeDataServicePortTypeProxy client= new ModeDataServicePortTypeProxy(url);
/

@param modeId 表单ID
@param userId 用户ID
@param conditions 查询条件
@param right (y/n)是否受权限控制
/
System.out.println(client.getAllModeDataCount(127, 1, “”, “Y”));
}

/**
获取表单内容
@throws RemoteException
/
publicvoid getModeDataByID() throws RemoteException{
ModeDataServicePortTypeProxy client= new ModeDataServicePortTypeProxy(url);
/
@param modeId 表单ID
@param Id 数据ID
@param userId 用户ID
@param right (y/n)是否受权限控制
@param isReturnDetail (y/n)是否返回明细表数据
/
System.out.println(client.getModeDataByID(127, 3, 1,”Y”, “Y”));
}

publicvoid getAllModeDataList() throws RemoteException{
ModeDataServicePortTypeProxy client= new ModeDataServicePortTypeProxy(url);
/


@param modeId 表单ID
@param pageNo 当前页数
@param pageSize 每页记录数
@param recordCount 记录总数(小于等于0时自动计算记录总数)
@param userid 当前用户
@param conditions 查询条件
@param right (y/n)是否受权限控制
@param isReturnDetail (y/n)是否返回明细表数据
/
System.out.println(client.getAllModeDataList(127, 1, 2,-1,1,”Y”, “Y”,”N”));
}

}

**

附录1 如何通过wsdl地址生成客户端代码

Ø Wsdl地址:http://192.168.7.200:8080/services/WorkflowService?wsdl
Ø 生成工具eclipse
Ø 步骤如下:
1) 选择新建Web Service Client
2) 输入wsdl地址,然后点击下一步
3) 选择客户端代码输出的位置,点击完成即可