O2OA教程-业务开发与设计-定时任务与服务接口

532 阅读8分钟

服务管理包括代理和接口,都是在服务端运行。O2OA中代理就是定时任务。接口可以提供Http服务让外部程序调用。
代理和接口运行的都是后端脚本。在O2OA中,后端脚本也是Javascript,基于JDK8标准的Nashorn,遵循ECMAScript 5.1规范。如果您需要了解Nashorn,可以点击此查看

前后端脚本的差异

O2OA中复杂的应用通常需要通过Javascript来实现。根据运行环境的差异,分为前后端脚本。
前端脚本是运行在浏览器上的,本系统的前端脚本基于mootools来构建,遵循ECMAScript 5.1规范。
后端脚本运行在服务器上,基于JDK8标准的Nashorn,遵循ECMAScript 5.1规范。
前端脚本在本系统的API中有详细介绍,这里不再过多介绍。后端脚本在视图列脚本、流程事件、接口
和代理中都有使用,并且这些地方的上下文都有不同。

前端脚本 视图列 流程事件 接口和代理
运行环境 浏览器 服务器端 服务器端 服务器端
访问DOM对象 允许 不允许 不允许 不允许
API方法 查看 this.value(本列的列值)、this.entry.data(本行的数据) this.data、this.workContext、this.org this.org
允许使用“脚本组件” 可以使用this.include()跨应用调用,比如流程中的脚本可以调用门户中的脚本组件。 不允许 允许使用本应用 不允许
使用JAVA 不允许 不允许 允许 允许

代理和接口的脚本编写

本节内容适用于流程设计中的脚本

输出调试信息

var text = "在服务器控制台输出的消息"
print( text );

调用JAVA类

//classString 为类名字符串,比如 "java.util.Calendar"
var Class = Java.type( classString );
var object = new Class();
//object.method()
或者
var object = new Class();
//比如 var simpleDateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
样例:
获取当前日期后的第5天
function setDate(){
    var Date = java.util.Date();
    var Calendar = Java.type("java.util.Calendar");
    var GregorianCalendar = Java.type("java.util.GregorianCalendar");
    var now = new Date();
    var calendar = new GregorianCalendar();
    calendar.setTime(now);
    calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - Config.waitDay);
    return calendar.getTime();
}

调用服务

调用O2OA后台服务

服务查看和调试
打开 http://centerserver:20030/x_program_center/jest/list.html
本小节中的“服务根(serviceRoot)”如下:

x_processplatform_assemble_surface 流程平台相关服务
x_portal_assemble_surface 门户平台相关服务
x_cms_assemble_control 内容管理平台相关服务
x_query_assemble_surface 数据平台相关服务
x_organization_assemble_express 组织架构相关服务
x_file_assemble_control 云文件相关服务
x_meeting_assemble_control 会议管理相关服务
x_bbs_assemble_control 论坛相关服务
x_calendar_assemble_control 日程管理相关服务
x_hotpic_assemble_control 热点信息相关服务
x_mind_assemble_control 脑图模块相关服务
x_organization_assemble_personal 个人设置相关服务
x_attendance_assemble_control 考勤模块相关服务

查找method,后台服务有GET\POST\PUT\DELET几种方法,可以在服务详情中找到,如下图:

本小节中的“路径(path)”,可以在服务详情中找到,如下图:

以上图的服务为例,最后拼接成下列两种路径均可使用
/jaxrs/work/workorworkcompleted/dcd8e168-2da0-4496-83ee-137dc976c7f6

work/workorworkcompleted/dcd8e168-2da0-4496-83ee-137dc976c7f6

GET方法

var applications = resources.getContext().applications();
//serviceRoot 服务根
//path 路径
applications.getQuery( serviceRoot, path );
样例:
已知work id为dcd8e168-2da0-4496-83ee-137dc976c7f6,获取work内容,并解析成JSON。
var applications = resources.getContext().applications();
var serviceRoot = "x_processplatform_assemble_surface";
var path = "work/workorworkcompleted/dcd8e168-2da0-4496-83ee-137dc976c7f6"
var resp = applications.getQuery( serviceRoot, path );
var json = JSON.parse( resp.toString() );

POST方法

var applications = resources.getContext().applications();
//serviceRoot 服务根
//path 路径
//string 数据字符串,json转字符串可以用 JSON.stringify( json )
applications.postQuery( serviceRoot, path, string );

样例:
已知发文流程的ID为“0b7c5c43-caa8-4789-a263-308508d44016”,发起人的dn是“张三@zhangsan@I”。需要发起一个流程。
查到发起流程的路径是“jaxrs/work/process/{processFlag}”。

var applications = resources.getContext().applications();
var serviceRoot = "x_processplatform_assemble_surface";
var path = "work/process/0b7c5c43-caa8-4789-a263-308508d44016";
var string = JSON.stringify({
    "latest" : false,
    "title" : "测试发文流程",
    "identity" : "张三@zhangsan@I",
    "data" : {  //业务数据
         "fileNoPrefix" : "xxx"  //文号冠字
    }
});
var resp = applications.postQuery( serviceRoot, path, string );
var json = JSON.parse( resp.toString() );

PUT方法

var applications = resources.getContext().applications();
//serviceRoot 服务根
//path 路径
//string 数据字符串,json转字符串可以用 JSON.stringify( json )
applications.putQuery( serviceRoot, path, string );

样例:
已知发文流程实例的work id为“0b7c5c43-caa8-4789-a263-308508d44016”,需要更新数据。
查到修改流程数据的路径是“jaxrs/data/work/{id}”。

var applications = resources.getContext().applications();
var serviceRoot = "x_processplatform_assemble_surface";
var path = "data/work/0b7c5c43-caa8-4789-a263-308508d44016";
var string = JSON.stringify({
    "subject" : "测试流程11",
    "fileNoPrefix" : "xxx1"
});
var resp = applications.putQuery( serviceRoot, path, string );
var json = JSON.parse( resp.toString() );

DELETE方法

var applications = resources.getContext().applications();
//serviceRoot 服务根
//path 路径
applications.deleteQuery( serviceRoot, path );

样例:
已知发文流程实例的work id为“0b7c5c43-caa8-4789-a263-308508d44016”,需要删除改流程实例。
查到删除流程实例的路径是“jaxrs/work/{id}”。

var applications = resources.getContext().applications();
var serviceRoot = "x_processplatform_assemble_surface";
var path = "work/0b7c5c43-caa8-4789-a263-308508d44016";
var resp = applications.deleteQuery( serviceRoot, path );
var json = JSON.parse( resp.toString() );

调用本系统服务管理中的接口

样例:现有一个名称为“sendSMS”的接口,接收的requestText为 "{ mobile : mobile, content : content }"

var CipherConnectionAction = Java.type('com.x.base.core.project.connection.CipherConnectionAction');
var Config = Java.type('com.x.base.core.project.config.Config');
var path = "invoke/sendSMS/execute";
var dataString = JSON.stringify({
    "mobile" : "13500000000",
    "content" : "测试短信内容"
});
var resp = CipherConnectionAction.post(false, Config.url_x_program_center_jaxrs() + path, dataString );
//var resp = CipherConnectionAction.post(false, Config.x_program_centerUrlRoot() + path, dataString );
var json = JSON.parse( resp.toString() );

调用外系统的服务

样例:现有一个外系统的服务,url为 'http://hostname/UnifiedWorkbench/ProcessTaskService',接收的Content-type 为 'text/xml; charset=utf-8'

function sendRequest( xml ){
    try{
        print("发起请求:"+xml);
        var url =  'http://hostname/UnifiedWorkbench/ProcessTaskService'
        var ArrayList = Java.type('java.util.ArrayList');
        var heads = new ArrayList();
        var NameValuePair = Java.type('com.x.base.core.project.bean.NameValuePair');
        var p1 = new NameValuePair('Content-Type', 'text/xml; charset=utf-8');
        heads.add(p1);
        var HttpConnectionClass = Java.type('com.x.base.core.project.connection.HttpConnection');
        var resp = HttpConnectionClass.postAsString(url, heads, xml);
        print( "统一待办返回:"+ resp.toString());
    }catch(e){
        print("发送请求出错:");
        print(  e.printStackTrace() );
    }
}

人员组织操作

组织管理中包括人员、人员属性、组织、组织属性、身份、群组和角色。有两种方法可以进行组织管理的操作:

  1. 通过调用后台组织查询服务“x_organization_assemble_express”进行组织管理的操作。具体服务请查看 “http://applicationServer:20020/x_organization_assemble_express/jest/index.html”
  2. 你可以通过 this.org 获取组织中的人员、人员属性、组织、组织属性、身份、群组和角色。 具体请查看API的org章节

代理

代理是运行在服务器端的定时任务,使用Javascript编写,可以直接调用Java类。

入口

点系统的左上角导航->设计中心->服务管理->代理打开。

触发时间

点击“定时任务cron表达式”可选择cron表达式进行触发时间的配置。cron表达式详解点击这里

代理调试

打开URL: http://centerServer:20030/x_program_center/jest/index.html
在 上图的服务中填写代理的标识,然后点击GET,可以忽略触发时间设置,马上执行代理。
可以在代理中使用print( text )在服务器控制台输出调试信息。

完整样例

样例名称 链接
统一待办 链接
EXCEL操作 链接

更多样例可以查看 webServer/x_component_service_AgentDesigner/sample/目录

接口

接口可以提供Http服务让外部程序调用,使用Javascript编写,可以直接调用Java类。

入口

点系统的左上角导航->设计中心->服务管理->接口打开。

访问限制

如果“访问的地址表达式”不为空,那么只有匹配的地址可以访问,允许使用通配符。

接口调用

接口请求方式 http
请求地址 http://centerServer:20030/x_program_center/jaxrs/invoke/{flag}/execute
flag的值优先级为
1、别名不为空,使用别名;
2、名称不为空,使用名称;
3、也可以使用id作为flag。
请求方法 POST
请求标头 Content-Type: application/json
响应标头 Content-Type: application/json; charset=utf-8

接口调试

打开URL: http://centerServer:20030/x_program_center/jest/index.html

在 上图的服务中填写接口的标识(接口别名、名称或者ID),在JsonElement区域输入接口接收数据,然后点击POST进行调试,接口会在Result区域输出返回数据。
可以在接口中使用print( text )在服务器控制台输出调试信息。

输入和输出

在接口脚本中可以使用 requestText 来获取请求的内容。
在接口脚本的末尾使用直接量作为接口的输出。
样例: 在调用接口的时候提交的报文为 { "subject" : "接口测试样例" },那么脚本中的获取为:

var requestJson = JSON.parse(requestText);
if( typeof(requestJson) === "string" ){ //某些情况下可能需要转换两次
    requestJson = JSON.parse(requestJson);
}
var subject = requestJson.subject; //subject值为"接口测试样例"
var result = { "result" : "已获取subject"+subject };
result; //接口的输出
最终接口的http request正文如下
{
    "type": "success",
    "data": {
        "value": { //接口脚本的输出内容
            "result": "已获取subject这是一个测试接口"
        }
    },
    "message": "",
    "date": "2019-08-18 18:09:24",
    "spent": 397,
    "size": -1,
    "count": 0,
    "position": 0
}

当前用户

使用 effectivePerson 来获取当前用户。
如果未登录系统,返回如下:

{
 "tokenType": "anonymous",
 "token": "",
 "name": "anonymous",
 "unique": "anonymous",
 "distinguishedName": "anonymous",
 "debugger": true,
 "remoteAddress": "115.216.34.235",
 "uri": "/x_program_center/jaxrs/invoke/invokeTest/execute",
 "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0"
}

如果已登录系统,返回如下:

{
"tokenType": "user", //如果是管理员为manager
"token": "jlMh2guoFibWcTwR3NHdVTbw_ylqeq-uFLrLL9stmcruJSx7mPOjiX-euWIQv-ovp8orv1dTAwkavfdfdfdfdf",
"name": "张三",
"unique": "zhangsan",
"distinguishedName": "张三@zhangsan@P",
"debugger": true,
"remoteAddress": "115.216.34.235",
"uri": "/x_program_center/jaxrs/invoke/invokeTest/execute",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134"
}

完整样例

样例名称 链接
用户同步接口 链接
组织同步接口 链接

更多样例可以查看 webServer/x_component_service_InvokeDesigner/sample/ 目录