1. 第三方报表集成
1.1. 报表插件
1.1.1. 1.第三方登录信息配置
为了降低和现有代码的耦合,第三方报表集成一般以独立插件形式存在。通常情况下在开发环境把第三方报表对应的服务地址配置在该独立插件的配置文件中。以分析云报表的集成插件为例,配置如下:
这样在线上部署环境,我们就可以通过协同系统配置器动态修改这几个参数,如下:
1.1.2. 2.插件启动过程
①为了让第三方报表作为一个独立插件随着Spring容器启动,我们需要让Spring帮我们创建一个第三方报表的Bean,即在该插件的Manager配置文件中注册一个Bean指向第三方报表的实现类。如下:
该实现类需要同时实现两个接口
其中SystemInitializer为T1开发框架的标准系统初始化接口,initialize和destroy方法分别在系统启动和停止时调用(详细启动实现过程我们不必关心)
另一个ReportCategoryBinding接口为标准的报表分类适配接口,该接口定义了到目前为止OA侧支持的对第三方报表的各个操作,比如权限检测、报表绑定、报表解绑等。
②在系统启动时,BiInsideCategoryBinding实现类会自动创建第三方报表的管理员角色,并读取相关登录信息注入到当前环境备用。
1.2. 报表管理员角色分配
在步骤二中系统启动时创建了第三方报表的管理员角色之后,我们需要将该角色授权给对应的系统人员账号才可以在报表中心-->报表管理菜单下显示出第三方报表页面。
使用单位管理员账号登录OA系统修改对应的人员角色并保存,如下:
保存之后即可在报表中心—>报表管理菜单下看到第三方报表集成菜单。
1.3. 报表基础功能
通常情况下第三方报表集成页面包含报表绑定、解除绑定、移动至和授权这四个功能按钮。
1.3.1. 1.报表绑定
即建立OA侧和第三方报表系统两端的报表对应关系,点击“绑定”按钮时会调用第三方报表提供的报表数据查询接口将可以进行绑定的报表数据展示成树形结构备选。
第三方报表数据查询接口定义在BiInsideCategoryBinding的findSelectedTreeNodes方法中,根据不同系统自行调整接口URL地址及参数即可。
选择要进行绑定的报表之后点击确认按钮会产生该报表在两侧系统的对应关系及权限信息并记录到OA侧数据库(表vreport_record和表vreport_record_auth)。
1.3.2. 2.解除绑定
解除绑定即删除上述建立的两个系统中报表的对应关系及权限数据(表vreport_record和表vreport_record_auth)。
对应后台VReportManagerImpl.removeVReportRecord方法:
1.3.3. 3.移动至
即修改所选报表从当前报表分类修改为另一个报表分类。
对应后台VReportManagerImpl.updateReportCategory方法。
1.3.4. 4.授权
授权即给予OA侧指定人员在报表中心-报表分析菜单下查看该绑定报表的权限。
对应后台VReportManagerImpl.updateVReportAuth,在此要注意每次授权操作会将原来的权限信息删除,重新记录被授权的人员或部门信息(表vreport_record的auth字段和表vreport_record_auth)。
1.4. 报表自定义功能扩展
除了上述四个基本功能按钮之外,现有的集成接口还提供了扩展功能接口,实际开发过程中可根据需要按需扩展,仍以分析云报表为例:
假如我们需要在报表集成工具栏增加一个自定义的功能按钮(此处以点击按钮打开指定URL为例),则直接在BiInsideCategoryBinding实现类的getExtendFunctions方法中增加该按钮的定义即可,包括页面元素ID,按钮显示文字,样式,返回值等。
在打开BI分析云报表页面时前端控制器会取出该实现类中所有扩展功能,将自定义扩展按钮的定义传递到前台页面。
前台JS(otherReportHome.js)会根据自定义类型自动生成对应类型的功能按钮。
当然,扩展功能接口也可以在后台调用,比如在监听到人员分析员报表管理员角色变化时,将对应人员信息通知分析云。则我们只需在分析云集成实现类BiInsideCategoryBinding的getExtendFunctions方法中增加一个类型为RoleChgNotifyFunction的Function将接口调用逻辑复写即可。
调用时取出该实现类的所有扩展Function根据类型去匹配并调用。
其它扩展功能接口使用方法类似:
1.5. 报表外部REST接口
1.5.1. 1.第三方报表系统参数查询接口
①查询当前OA侧支持的系统参数(各个参数含义见附录)
请求说明:
请求路径 | /seeyon/rest/vreport/sysVar/list |
---|---|
HTTP请求method | GET注: (GET:请求参数在URL中, POST:请求参数在BODY中) |
请求参数:
节点名称 | 父节点 | 类型 | 长度 | 是否必填 | 描述 |
---|---|---|---|---|---|
应答参数:
名称 | 父节点 | 类型 | 长度 | 是否必填 | 描述 |
---|---|---|---|---|---|
code | String | 是 | 结果状态码 | ||
data | Object | 是 | 结果数据 | ||
params | data | Array | 是 | 参数代码列表 | |
message | String | 否 | 结果描述 |
请求示例
②查询指定系统参数(支持批量查询)
请求说明:
请求路径 | /seeyon/rest/vreport/sysVar/{memberId}/{pram1}\ | {pram2}\ | ... |
---|---|---|---|
HTTP请求method | GET注: (GET:请求参数在URL中, POST:请求参数在BODY中) |
请求参数:
节点名称 | 父节点 | 类型 | 长度 | 是否必填 | 描述 |
---|---|---|---|---|---|
memberId | Long | 是 | 人员ID | ||
pramN | String | 是 | 参数代码,含义见附录 |
应答参数:
名称 | 父节点 | 类型 | 长度 | 是否必填 | 描述 |
---|---|---|---|---|---|
code | String | 是 | 结果状态码 | ||
data | Object | 是 | 结果数据 | ||
message | String | 否 | 结果描述 |
请求示例:
1.5.2. 2.判断人员是否有访问指定报表的权限
请求说明:
请求路径 | /seeyon/rest/vreport/hasAuth/{memberId}/{reportId} |
---|---|
HTTP请求method | POST注: (GET:请求参数在URL中, POST:请求参数在BODY中) |
请求参数:
节点名称 | 父节点 | 类型 | 长度 | 是否必填 | 描述 |
---|---|---|---|---|---|
memberId | Long | 是 | OA侧人员编号 | ||
reportId | Long | 是 | 报表ID |
应答参数:
名称 | 父节点 | 类型 | 长度 | 是否必填 | 描述 |
---|---|---|---|---|---|
code | String | 是 | 结果状态码 | ||
data | Object | 是 | 结果数据 | ||
hasAuth | data | Boolean | 是 | true有权限;false无权限 | |
message | String | 否 | 结果描述 |
请求示例
1.5.3. 3.第三方报表绑定
请求说明:
请求路径 | /seeyon/rest/vreport/thirdBind |
---|---|
HTTP请求method | POST注: (GET:请求参数在URL中, POST:请求参数在BODY中) |
请求参数:
节点名称 | 父节点 | 类型 | 长度 | 是否必填 | 描述 |
---|---|---|---|---|---|
memberId | Long | 是 | OA侧人员编号 | ||
moduleId | int | 是 | 第三方系统模块ID | ||
reportCategoryId | Long | 是 | OA侧报表分类ID | ||
id | Long | 是 | OA侧报表ID | ||
name | String | 是 | OA侧报表名称 | ||
category | boolean | 是 | 是否为目录 | ||
parentId | Long | 是 | 父级目录ID | ||
properties | Object | 是 | 其它属性 | ||
platform | properties | String | 是 | 客户端类型:0-PC端;1-移动端 |
应答参数:
名称 | 父节点 | 类型 | 长度 | 是否必填 | 描述 |
---|---|---|---|---|---|
code | String | 是 | 结果包体 | ||
data | String | 是 | true绑定成功;false绑定失败 | ||
message | String | 否 | 结果描述 |
请求示例:
1.5.4. 4.第三方报表解绑
请求说明:
请求路径 | /seeyon/rest/vreport/thirdUnBind |
---|---|
HTTP请求method | POST注: (GET:请求参数在URL中, POST:请求参数在BODY中) |
请求参数:
节点名称 | 父节点 | 类型 | 长度 | 是否必填 | 描述 |
---|---|---|---|---|---|
memberId | Long | 是 | OA侧人员编号 | ||
reportId | Long | 是 | 第三方报表ID |
应答参数:
名称 | 父节点 | 类型 | 长度 | 是否必填 | 描述 |
---|---|---|---|---|---|
code | String | 是 | 结果包体 | ||
data | Boolean | 是 | true解绑成功;false解绑失败 | ||
message | String | 否 | 结果描述 |
调用示例:
1.5.5. 5.第三方报表授权
请求说明:
请求路径 | /seeyon/rest/vreport/thirdAuth |
---|---|
HTTP请求method | POST注: (GET:请求参数在URL中, POST:请求参数在BODY中) |
请求参数:
节点名称 | 父节点 | 类型 | 长度 | 是否必填 | 描述 | |
---|---|---|---|---|---|---|
memberId | Long | 是 | OA侧人员编号 | |||
reportId | Long | 是 | 第三方报表ID | |||
auths | Array | 是 | 权限信息(组织类型\ | 组织ID) |
应答参数:
名称 | 父节点 | 类型 | 长度 | 是否必填 | 描述 |
---|---|---|---|---|---|
code | String | 是 | 返回状态码 | ||
data | Boolean | 是 | true解绑成功;false解绑失败 | ||
message | String | 否 | 结果描述 |
调用示例:
1.6. 附录
1.6.1. 1.系统条件参数字典
参数描述 | 请求参数 |
---|---|
登录人员ID | org_currentUserId |
登录人员所在部门ID | org_currentUserDepartmentId |
登录人员所在上级部门ID | org_currentUserSuperiorDeptId |
登录人员所在一级部门ID | org_currentUserFirstDeptId |
登录人员岗位ID | org_currentUserPostId |
登录人员职务级别ID | org_currentUserJobLevelId |
登录人员所在单位ID | org_currentUserUnitId |
登录人员所在部门ID(包含子部门) | org_currentUserIncludeChildDepartmentId |
登录人员所在上级部门ID(包含子部门) | org_currentUserIncludeChildSuperiorDeptId |
登录人员所在一级部门ID(包含子部门) | org_currentUserIncludeChildFirstDeptId |
登录人员所在单位ID(包含子单位) | org_currentUserUnitId |
登录人员主管各部门ID | org_currentUserManagerDepartmentId |
登录人员主管各部门ID(包含子部门) | org_currentUserIncludeChildManagerDepartmentId |
登录人员分管各部门ID | org_currentUserLeaderDepartmentId |
登录人员分管各部门ID(包含子部门) | org_currentUserIncludeChildLeaderDepartmentId |
登录人员兼岗各部门ID | org_currentUserDeputyPostDepartmentId |
登录人员兼岗各部门ID(包含子部门) | org_currentUserIncludeChildDeputyPostDepartmentId |
登录人员所在部门及兼岗各部门ID | org_currentUserDeptAndDeputyPostDeptId |
登录人员所在部门及兼岗各部门ID(包含子部门) | org_currentUserIncludeChildDeptAndDeputyPostDeptId |
登录人员姓名 | org_currentUserTrueName |
登录人员登录名 | org_currentUserLoginName |
登录人员的人员状态 | org_currentUserState |
登录人员的人员类别 | org_currentUserType |
登录人员所在部门名称 | org_currentUserDepartment |
登录人员所在上级部门名称 | org_currentUserSuperiorDept |
登录人员所在一级部门名称 | org_currentUserFirstDept |
登录人员岗位名称 | org_currentUserPost |
登录人员职务级别名称 | org_currentUserJobLevel |
登录人员所在单位名称 | org_currentUserUnit |
登录人员所在单位编码 | org_currentUserUnitCode |
登录人员所在部门编码 | org_currentUserDepartmentCode |
登录人员编号 | org_currentUserCode |
登录人员岗位代码 | org_currentUserPostCode |
登录人员所在外部单位ID | org_currentUserExternalDepartmentId |
登录人员所在外部机构ID | org_currentUserExternalSuperiorDepartmentId |
登录人员负责的各外部单位ID | org_currentUserManagerExternalDepartmentId |
登录人员负责的各外部机构ID | org_currentUserManagerExternalSuperiorDepartmentId |
登录人员负责的各外部机构ID(包含子机构) | org_currentUserIncludeChildManagerExternalSuperiorDepartmentId |
登录人员所在外部单位名称 | org_currentUserExternalDepartment |
登录人员所在外部机构名称 | org_currentUserExternalSuperiorDepartment |
系统日期 | date_systemDate |
系统日期时间 | date_dateTime_systemDateTime |
系统时间 | date_time_systemTime |
本周初日期 | date_firstDay4ThisWeek |
本周末日期 | date_lastDay4ThisWeek |
本月初日期 | date_firstDay4ThisMonth |
本月末日期 | date_lastDay4ThisMonth |
本季度初日期 | date_firstDay4ThisSeason |
本季度末日期 | date_lastDay4ThisSeason |
本年初日期 | date_firstDay4ThisYear |
本年末日期 | date_lastDay4ThisYear |
上周初日期 | date_firstDay4PreviousWeek |
上周末日期 | date_lastDay44PreviousWeek |
上月初日期 | date_firstDay4PreviousMonth |
上月末日期 | date_lastDay4PreviousMonth |
上季度初日期 | date_firstDay4PreviousSeason |
上季度末日期 | date_lastDay4PreviousSeason |
上年初日期 | date_firstDay4PreviousYear |
上年末日期 | date_lastDay4PreviousYear |
下周初日期 | date_firstDay4NextWeek |
下周末日期 | date_lastDay4NextWeek |
下月初日期 | date_firstDay4NextMonth |
下月末日期 | date_lastDay4NextMonth |
下季度初日期 | date_firstDay4NextSeason |
下季度末日期 | date_lastDay4NextSeason |
下年初日期 | date_firstDay4NextYear |
下年末日期 | date_lastDay4NextYear |
明日 | date_tomorrow |
昨日 | date_yesterday |
本年 | date_dec_thisYear |
本季度初日期 | date_firstDay4ThisSeason |
本季度末日期 | date_lastDay4ThisSeason |
本月 | date_dec_thisMonth |
本日 | date_dec_thisDay |