视图
View
在O2OA中,视图是展现、查询流程和内容管理数据的重要途径,也是各应用进行数据关联的工具。
入口
点系统的左上角导航->设计中心->数据中心->具体应用->视图打开。
视图的后台服务
http://applicationServer:20020/x_query_assemble_surface/jest/index.html
视图属性
基本
| 属性名 | 说明 |
|---|---|
| 标识 | 视图ID |
| 名称 | 视图名称 |
| 别名 | 视图别名 |
| 隐藏视图 | 隐藏后不会在点左上角导航->应用中显示 |
| 最大行数 | 视图展现的时候返回数据的最多数目 |
| 每页行数 | 视图展现的时候每页的数据数目 |
| 可执行人 | 允许执行视图的人。和可执行组织同时为空的时候,所有人可执行 |
| 可执行组织 | 允许执行视图的组织 |
范围
| 属性名 | 说明 |
|---|---|
| 可以选择流程平台数据或者是内容管理平台的数据 | |
| 权限 | 带权限:当前人员只能看到流转过的工作 忽略:当前人员可以看到符合过滤条件所有工作,但是没有流转过的不能打开 |
| 流转状态 | 只有选择流程平台数据的时候起作用 |
| 选择应用 | 只对应流程平台应用的数据 |
| 选择流程 | 只对应流程的数据,如果应用和流程同时选择的情,取并集 |
| 数据类型 | 信息类:只显示内容管理栏目或分类里文档类型设置为“信息”的数据 数据类:只显示内容管理栏目或分类里文档类型设置为“数据”的数据 全部:对文档类型无限制 |
| 选择栏目 | 只显示对应内容管理栏目的数据 |
| 选择分类 | 只显示对应内容管理分类的数据,如果栏目和分类同时选择 |
| 拟稿组织 | 只显示选择的拟稿组织的数据 |
| 拟稿人员 | 只显示选择的拟稿人员的数据 |
| 拟稿身份 | 只显示选择的拟稿身份的数据 |
| 隐藏视图 | 隐藏后不会在点左上角导航->应用中显示 |
| 时段 | 只显示符合时段内的数据,允许有偏移量 视图默认返回一年内的数据,如果需要返回更早时间的数据,请配置时段。 |
过滤
当选择“作为默认过滤条件”时,视图在执行的时候既根据该过滤条件进行过滤。 当选择“作为自定义过滤数据”时,用户可以根据配置自定义进行过滤。 路径:
平台流程填写对应的以下路径:
{
"$work" : {
"title" : "" , //标题
"startTime" : "", //创建时间
"startTimeMonth": "", //创建月份
"completedTime": "", //完成时间
"completedTimeMonth": "", //完成月份
"creatorPerson": "", //拟稿人
"creatorIdentity": "", //拟稿人身份
"creatorUnit": "", //拟稿组织
"creatorUnitLevelName": "", //拟稿组织层级
"application": "", //应用ID
"applicationName": "", //应用名称
"applicationAlias": "", //应用别名
"process": "", //流程ID
"processName": "", //流程名称
"processAlias": "", //流程别名
"serial": "", //编号
"activityType": "", //活动类型
"activityName": "", //活动名称
"activityArrivedTime": "", //活动到达时间
"workId": "", //工作ID
"workCompletedId": "", //已完成工作ID
"job": "", //JOB的ID(job)
"completed": "", //是否已完成(completed)
},
"subject" : "", //标题
"identity1" : [{ //身份/人员/组织/职务/群组 的存储形式
{
"name": "李四", //身份名称,不唯一
"unique": "23dd1b53-feed-485d-8c9c-1a4e64ff58a2", //身份唯一标识
"description": "", //身份描述
"distinguishedName": "李四@23dd1b53-feed-485d-8c9c-1a4e64ff58a2@I", //身份全称
"person": "李四@lisi@P", //人员
"unit": "开发部@kfb@U", //组织
"unitName": "开发部", //组织名称, 不唯一
"unitLevel": 2, //组织层级
"unitLevelName": "浙江兰德纵横/开发部", //组织层级名
"orderNumber": 24920439 //排序号
}
...
}]
...
}
如:流程ID "$work.workId"
标题填写:subject
身份dn填写:identity1.0.distinguishedName (数组用 “.0” 来表示下标)
内容管理填写对应的以下路径:
{
"$document" : {
"title" : "", //标题
"publishTime" : "", //发布时间
"creatorPerson" : "", //拟稿人
"creatorIdentity" : "", //拟稿人身份
"creatorUnitName" : "", //拟稿组织
"creatorTopUnitName" : "", //拟稿顶级组织
"appId" : "", //栏目ID
"appName" : "", //栏目名称
"categoryId" : "", //分类ID
"categoryName" : "", //分类名称
"categoryAlias" : "", //分类别名
"docid" : "", //文档ID
},
"subject" : "", //标题
"identity1" : [{ //身份/人员/组织/职务/群组 的存储形式
{
"name": "李四", //身份名称,不唯一
"unique": "23dd1b53-feed-485d-8c9c-1a4e64ff58a2", //身份唯一标识
"description": "", //身份描述
"distinguishedName": "李四@23dd1b53-feed-485d-8c9c-1a4e64ff58a2@I", //身份全称
"person": "李四@lisi@P", //人员
"unit": "开发部@kfb@U", //组织
"unitName": "开发部", //组织名称, 不唯一
"unitLevel": 2, //组织层级
"unitLevelName": "浙江兰德纵横/开发部", //组织层级名
"orderNumber": 24920439 //排序号
}
...
}]
...
}
如:文档ID填写 "$document.docid"
标题填写:subject
身份dn填写:identity1.0.distinguishedName (数组用 “.0” 来表示下标)
列属性
| 属性 | 说明 |
|---|---|
| 列标题 | 表格的标题 |
| 列名 | 列名,当需要操作数据的时候要用到(比如嵌入到表单中选择数据的时候) |
| 默认值 | 列值为空时的默认值 |
| 打开文档 | 点击该列的时候,是否打开文档 |
| 数据路径 | 查看本章-视图属性-过滤-路径的介绍 |
| 排序 | 该列是否排序,只有第一个排序列有效 |
| 分类 | 该列是否分类,只能有一个分类列 |
| 隐藏 | 显示的时候,该列是否隐藏 |
| 组织对象 | 如果选是,那么只显示数组第一个值的 name 属性 |
| HTML值 | 如果选择是,则作为单元格的innerHTML显示 |
| 显示脚本 | 可以通过脚本对列值进行计算。 this.value:为列原来的值 this.entry.data: 该行所有列的值 显示脚本最终需要 return 放回值 |
视图的使用
在表单、页面中嵌入视图
可以在表单中使用“嵌入视图”组件
选择视图的数据到表单
在表单中使用“选择视图”组件,可以进行流程、内容管理分类直接的数据关联。
上图中的 field_1 为本表单的组件标识,column_1 为视图的列名。
当用户选择视图后,会将选中行 column_1 列的值赋值给 field_1 。
当 选择结果处理 选择 “脚本”的时候,可以通过 this.target.selectedData 来获取用户选择行的数据。数据格式如下:
{[
bundle : "xxxx", //CMS文档Id/流程jobId
data : { //列数据
column1Name : column1Value, //第一列的列名,第一列的列值
column2Name : column2Value, //第二列的列名,第二列的列值
...
},
...
]}
在脚本中的使用 可以查看API的 view章节进行学习,点击打开链接
数据表
数据表能够在系统数据库中自动创建真实表,并生成java实体对象,您可以使用JPQL操作数据表。当应用的数据特别大的时候,或者需要比视图更灵活的查询的时候,需要用到数据表。
入口
点系统的左上角导航->设计中心->数据中心->具体应用->数据表打开
数据表的后台服务
http://applicationServer:20020/x_query_assemble_surface/jest/index.html
创建数据表
- 创建数据表,并创建每一列;
- 点击工具栏按钮,将数据表发布到编译状态;
- 点击工具栏按钮,执行“编译所有数据表”操作
- 重启服务器,数据表就可以使用了。
JPA JPQL语句
在数据表的查询中,调用服务的时候需要传入JPA JPQL语句,如o.name='zhangsan'。
了解JPQL语句可以点击链接查看:www.objectdb.com/java/jpa/qu…
数据表脚本
目前在表单和页面中还没有数据表组件,需要通过脚本来进行增删改查的执行。
- 创建一个脚本名称为 queryTableService,代码如下:
var _self = this;
window.QueryTableService = new Class({
Implements: [Options, Events],
options : {
tableFlag : ""
},
initialize : function( options ){
this.setOptions( options || {});
this.action = new _self.Action("x_query_assemble_surface", {
"listRowNext" : {
"uri" : "/jaxrs/table/list/{tableFlag}/row/{id}/next/{count}",
"method": "GET"
},
"listRowPrev" : {
"uri" : "/jaxrs/table/list/{tableFlag}/row/{id}/prev/{count}",
"method": "GET"
},
//通过where 获取表中的数据,格式为jpa jpql语法,o.name='zhangsan'
"listRowSelectWhere" : {
"uri" : "/jaxrs/table/list/{tableFlag}/row/select/where/{where}",
"method": "GET"
},
"rowGet" : {
"uri": "/jaxrs/table/{tableFlag}/row/{id}", //获取表中某一行数据
"method": "GET"
},
"rowUpdate":{
"uri": "/jaxrs/table/{tableFlag}/row/{id}", //更新指定表中指定行数据.
"method": "PUT"
},
"rowInsert":{
"uri": "/jaxrs/table/{tableFlag}/row", //插入一行
"method": "POST"
},
"rowCountWhere" : {
"uri": "/jaxrs/table/{tableFlag}/row/count/where/{where}", //通过where 统计数量
"method": "GET"
},
"rowDelete" : {
"uri": "/jaxrs/table/{tableFlag}/row/{id}", //更新指定表中指定行数据.
"method": "DELETE"
},
"rowDeleteAll" : {
"uri": "/jaxrs/table/{tableFlag}/row/delete/all", //通过where 统计数量
"method": "DELETE"
}
});
},
listNext : function(rowId, count, callback_success, callback_fail, async){
var opt = {
"name": "listRowNext",
"parameter": {
"tableFlag": this.options.tableFlag,
"id" : rowId,
"count" : count || 20
},
"success": function(json){
if(callback_success)callback_success(json);
}.bind(this),
"async" : async
};
if( callback_fail ){
opt.failure = function(xhr, text, error){
callback_fail( xhr, text, error );
}
}
this.action.invoke( opt );
},
listPrev : function(rowId, count, callback_success, callback_fail, async){
var opt = {
"name": "listRowPrev",
"parameter": {
"tableFlag": this.options.tableFlag,
"id" : rowId,
"count" : count || 20
},
"success": function(json){
if(callback_success)callback_success(json);
}.bind(this),
"async" : async
}
if( callback_fail ){
opt.failure = function(xhr, text, error){
callback_fail( xhr, text, error );
}
}
this.action.invoke(opt);
},
listByWhere : function(where, callback_success, callback_fail, async){
var opt = {
"name": "listRowSelectWhere",
"parameter": {
"tableFlag": this.options.tableFlag,
"where" : where
},
"success": function(json){
if(callback_success)callback_success(json);
}.bind(this),
"async" : async
};
if( callback_fail ){
opt.failure = function(xhr, text, error){
callback_fail( xhr, text, error );
}
}
this.action.invoke(opt);
},
get : function( rowId, callback_success, callback_fail, async ){
var opt = {
"name": "rowGet",
"parameter": {
"tableFlag": this.options.tableFlag,
"id" : rowId
},
"success": function(json){
if(callback_success)callback_success(json);
}.bind(this),
"async" : async
};
if( callback_fail ){
opt.failure = function(xhr, text, error){
callback_fail( xhr, text, error );
}
}
this.action.invoke(opt);
},
create : function( data, callback_success, callback_fail, async ){
data.o2_createPerson = layout.desktop.session.user.distinguishedName;
data.o2_createUnit = Utils.getCurrentDepartment();
var opt = {
"name": "rowInsert",
"parameter": {
"tableFlag": this.options.tableFlag
},
"data" : data,
"success": function(json){
if(callback_success)callback_success(json);
}.bind(this),
"async" : async
};
if( callback_fail ){
opt.failure = function(xhr, text, error){
callback_fail( xhr, text, error );
}
}
this.action.invoke(opt);
},
update : function( rowId, data, callback_success, callback_fail, async ){
data.o2_updatePerson = layout.desktop.session.user.distinguishedName;
var opt = {
"name": "rowUpdate",
"parameter": {
"tableFlag": this.options.tableFlag,
"id" : rowId
},
"data" : data,
"success": function(json){
if(callback_success)callback_success(json);
}.bind(this),
"async" : async
};
if( callback_fail ){
opt.failure = function(xhr, text, error){
callback_fail( xhr, text, error );
}
}
this.action.invoke(opt);
},
save : function( data, callback_success, callback_fail, async ){
var opt = {
"name": data.id ? "rowUpdate" : "rowInsert",
"parameter": {
"tableFlag": this.options.tableFlag
},
"data" : data,
"success": function(json){
if(callback_success)callback_success(json);
}.bind(this),
"async" : async
};
if( callback_fail ){
opt.failure = function(xhr, text, error){
callback_fail( xhr, text, error );
}
}
if(data.id)opt.parameter.id = data.id;
this.action.invoke(opt);
},
count : function( where, callback_success, callback_fail, async ){
var opt = {
"name": "rowGet",
"parameter": {
"tableFlag": this.options.tableFlag,
"where" : where
},
"success": function(json){
if(callback_success)callback_success(json);
}.bind(this),
"async" : async
};
if( callback_fail ){
opt.failure = function(xhr, text, error){
callback_fail( xhr, text, error );
}
}
this.action.invoke(opt);
},
delete : function( rowId, callback_success, callback_fail, async ){
var opt = {
"name": "rowDelete",
"parameter": {
"tableFlag": this.options.tableFlag,
"id" : rowId
},
"success": function(json){
if(callback_success)callback_success(json);
}.bind(this),
"async" : async
};
if( callback_fail ){
opt.failure = function(xhr, text, error){
callback_fail( xhr, text, error );
}
}
this.action.invoke(opt);
},
deleteAll : function( callback_success, callback_fail, async ){
var opt = {
"name": "rowDelete",
"parameter": {
"tableFlag": this.options.tableFlag
},
"success": function(json){
if(callback_success)callback_success(json);
}.bind(this),
"async" : async
};
if( callback_fail ){
opt.failure = function(xhr, text, error){
callback_fail( xhr, text, error );
}
}
this.action.invoke(opt);
}
});
- 在表单/页面的 queryLoad 里添加: this.include("queryTableService");
- 调用
var service = new QueryTableService({ tableFlag : "testTable" });
//保存
service.save({
"subject" : "标题",
"name" : "zhangsan"
}, function(){
this.form.notice("保存成功", "success");
}.bind(this))
//根据条件查询
service.listByWhere("o.name='zhangsan'", function( json ){
//json 为符合条件的数据列表
}, null, false)
//根据id获取数据
service.get( id, function( json ){
//json 为id对应的数据
}, null, false)
查询语句
查询语句是建立在数据表基数上的查询语句配置。配置查询语句后,在应用中可调用执行。
入口
点系统的左上角导航->设计中心->数据中心->具体应用->查询配置打开
查询语句的后台服务
http://applicationServer:20020/x_query_assemble_surface/jest/index.html
创建查询配置
- 创建查询配置;
- 选择语句类型和数据表;
- 编写查询语句,保存
查询语句
语法
查询语句用的是JPA JPQL语句,如 select o from tableName o where o.name='zhangsan'。
了解JPQL语句可以点击链接查看:www.objectdb.com/java/jpa/qu…
动态传参
查询语句中的where语句的值可以使用json传入
如:
查询语句的设计为 select o from tableName o where o.name=:n
在调用查询语句的时候传入 json
{
"n" : "zhangsan"
}
则 最终在后台拼接成的语句为
select o from tableName o where o.name='zhangsan'
使用
需要编写脚本去使用查询语句
方法一
o2.Actions.get( "x_query_assemble_surface" ).executeStatement(
statementFlag, //语句id、语句名称或语句别名
page, //页码,数字
size, //每页条数
data, //请求的json
function(json){
//json为执行結果
},
function(xhr){
//如果返回错误,在这里处理
},
async //同步还是异步
)
例如:现在已有一个查询语句配置select o from student o where o.class=:class,存储的别名是 selectStudent,取第一页的10条,那么方法如下:
o2.Actions.get( "x_query_assemble_surface" ).executeStatement(
"selectStudent",1,10,{
class : "01计算机一班"
},function(json){
//json 为返回的结果
}
)
方法二
var action = new this.Action( "x_query_assemble_surface", {
executeStatement:{ //服务命名1,自定义
"uri": "/jaxrs/statement/{flag}/execute/page/{page}/size/{size}", //服务地址1,形如 /jaxrs/...
"method": "POST" //请求方法,包括 GET POST PUT DELETE
}
);
action.invoke({
"name": "executeStatement", //自定义的服务名
"parameter": {
"flag": statementFlag, //语句id、语句名称或语句别名
"page" : page, //页码,数字
"size" : size //每页条数
}, //uri参数
"data": { }, //请求的正文
"success": function(json){ //服务调用成功时的回调方法,json 是服务返回的数据
//这里进行具体的处理
}.bind(this),
"failure" : function(xhr){ //服务调用失败时的回调方法,xhr 为 XMLHttpRequest 对象
//这里进行具体的处理
},
"async" : true, //同步还是异步,默认为true
});
例如:现在已有一个查询语句配置select o from student o where o.class=:class,存储的别名是 selectStudent,取第一页的10条,那么方法如下:
var action = new this.Action( "x_query_assemble_surface", {
executeStatement:{ //服务命名1,自定义
"uri": "/jaxrs/statement/{flag}/execute/page/{page}/size/{size}", //服务地址1,形如 /jaxrs/...
"method": "POST" //请求方法,包括 GET POST PUT DELETE
}
);
action.executeStatement({
"name": "executeStatement", //自定义的服务名
"parameter": { //uri参数
"flag": selectStudent, //语句id、语句名称或语句别名
"page" : 1, //页码,数字
"size" : 10 //每页条数
},
"data": { //请求的正文
class : "01计算机一班"
},
"success" : function(json){
//json 为返回的结果
}
})