O2OA教程-业务开发与设计-数据视图与数据统计

1,073 阅读9分钟

视图

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

创建数据表

  1. 创建数据表,并创建每一列;
  2. 点击工具栏按钮,将数据表发布到编译状态;
  3. 点击工具栏按钮,执行“编译所有数据表”操作
  4. 重启服务器,数据表就可以使用了。

JPA JPQL语句

在数据表的查询中,调用服务的时候需要传入JPA JPQL语句,如o.name='zhangsan'。
了解JPQL语句可以点击链接查看:www.objectdb.com/java/jpa/qu…

数据表脚本

目前在表单和页面中还没有数据表组件,需要通过脚本来进行增删改查的执行。

  1. 创建一个脚本名称为 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);
    }
});
  1. 在表单/页面的 queryLoad 里添加: this.include("queryTableService");
  2. 调用
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

创建查询配置

  1. 创建查询配置;
  2. 选择语句类型和数据表;
  3. 编写查询语句,保存

查询语句

语法

查询语句用的是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'

了解JPQL语句动态传参可以点击链接查看:www.objectdb.com/java/jpa/qu…

使用

需要编写脚本去使用查询语句

方法一

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 为返回的结果
     }
})