服务管理包括代理和接口,都是在服务端运行。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 )
在服务器控制台输出调试信息。
完整样例
更多样例可以查看 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/ 目录
来源:oschina
链接:https://my.oschina.net/o2oa/blog/3184946