OlapController(OLAP 交叉报表 / 大屏)¶
cn.myapps.report.controller.OlapController
OLAP 交叉报表与大屏控制器,集成 Mondrian 提供 MDX 查询、动态交叉报表查询与预览、大屏配置查询与大屏脚本执行能力。基址为**硬编码字面量** /report(类级 @RequestMapping("/report"),不读 context-path 占位符),并叠加方法级路径。
- 接口类型:REST 资源
- 类级注解:
@RestController、@CrossOrigin(origins = "*") - 基址:
/report - 鉴权:见 index.md 鉴权说明(无 token 强校验;含路径变量的端点需 accessToken 以派生 DES 解密密钥)
1. 执行 MDX 查询¶
直接执行一段 MDX 查询语句并返回结果字符串。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/report/query/api/olap(完整:/report/query/api/olap;如部署时 report 模块 servlet context-path 非/,需在最前再补 servlet context-path) - 鉴权:否(无 token 强校验;不读取用户身份)
- Tag:(未在源码标注)
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| mdx | body | string | 是(@RequestBody Map<String,String> 中的 mdx 键) |
MDX 查询语句,不可为空白 |
请求体¶
请求示例¶
POST /report/query/api/olap HTTP/1.1
Content-Type: application/json
{ "mdx": "SELECT ... FROM [SalesCube]" }
响应¶
结构:ResponseEntity<String>(非 Resource)。Content-Type: text/plain。
成功示例(200):
失败示例(400,mdx 为空):
2. 动态交叉报表查询¶
按已发布的交叉报表 ID 执行查询,返回该报表的 OLAP 结果(含标题、过滤器、显示类型、汇总开关与 olapResult)。路径变量经当前用户 id 解密。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/report/api/olap/applications/{applicationId}/dynamic/query/{crossReportId} - 鉴权:见 index.md 鉴权说明(需 accessToken:
{applicationId}与{crossReportId}经DesUtil.decryptTextByUserId(..., getUser().getId())解密) - Tag:(未在源码标注)
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 已加密的应用 ID(经 DES 加密,密钥为当前用户 id) |
| crossReportId | path | string | 是 | 已加密的交叉报表 ID |
请求示例¶
POST /report/api/olap/applications/__ENC_APP__/dynamic/query/__ENC_REPORT__?accessToken=<token> HTTP/1.1
响应¶
结构:统一 Resource(见 ../index.md「统一响应结构」)。
| errcode | 含义 |
|---|---|
| 0 | 成功 |
| 404 | 未找到交叉报表(应用与报表标识不匹配) |
| 500 | 业务异常(解密失败、查询失败等) |
data 结构:
| 字段 | 类型 | 说明 |
|---|---|---|
| title | string | 报表标题(来自 OlapObject.getTitle()) |
| filters | object | 报表过滤器配置 |
| reportShowType | string | 报表展示类型(如 chart_bar、table) |
| showTotalRow | boolean | 是否显示行汇总 |
| showTotalColumn | boolean | 是否显示列汇总 |
| olapResult | object | OLAP 结果(含 axes、slicerAxis、cells、queryString,见 OlapResult) |
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": {
"title": "销售分析",
"filters": { ... },
"reportShowType": "table",
"showTotalRow": true,
"showTotalColumn": false,
"olapResult": {
"axes": [ { "positions": [ { "members": [ { ... } ] } ] } ],
"slicerAxis": { ... },
"cells": [ { ... } ],
"queryString": "SELECT ..."
}
},
"errors": null
}
失败示例:
3. 获取大屏配置¶
按应用 ID 与大屏 ID 查询大屏定义(BigScreen)。路径变量经当前用户 id 解密。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/report/api/applications/{applicationId}/bigscreen/{bigscreenId} - 鉴权:见 index.md 鉴权说明(需 accessToken:路径变量经
DesUtil.decryptTextByUserId(..., getUser().getId())解密) - Tag:(未在源码标注)
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 已加密的应用 ID |
| bigscreenId | path | string | 是 | 已加密的大屏 ID |
请求示例¶
响应¶
结构:统一 Resource。data 为 BigScreen 对象(含大屏组件树、样式、数据源绑定等配置)。
| errcode | 含义 |
|---|---|
| 0 | 成功 |
| 500 | 业务异常(解密失败、未找到大屏等) |
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": {
"id": "...",
"name": "销售大屏",
"components": [ ... ]
},
"errors": null
}
失败示例:
4. OLAP 对象预览¶
按指定 OlapObject(在 body 中提交)执行预览查询,返回与「动态交叉报表查询」相同的 data 结构。applicationId 经当前用户 id 解密后写回 olapObject.applicationId。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/report/api/olap/applications/{applicationId}/olapobject/preview - 鉴权:见 index.md 鉴权说明(需 accessToken:
{applicationId}经DesUtil.decryptTextByUserId(..., getUser().getId())解密) - Tag:(未在源码标注)
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 已加密的应用 ID |
| (body) | body | OlapObject | 是(@RequestBody) |
待预览的 OLAP 对象(含 MDX/Schema/标题/过滤器/显示类型等) |
请求体¶
{
"title": "预览报表",
"filters": { ... },
"reportShowType": "table",
"showTotalRow": true,
"showTotalColumn": false,
"...其他 OlapObject 字段": "..."
}
请求示例¶
POST /report/api/olap/applications/__ENC_APP__/olapobject/preview?accessToken=<token> HTTP/1.1
Content-Type: application/json
{ "title": "预览报表", ... }
响应¶
结构:统一 Resource。data 结构同 端点 2。
| errcode | 含义 |
|---|---|
| 0 | 成功 |
| 500 | 业务异常 |
5. 大屏脚本执行¶
在指定应用上下文中执行一段大屏脚本(iScript / JavaScript),返回脚本执行结果。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/report/api/bigscreen/applications/{applicationId}/executeScript - 鉴权:见 index.md 鉴权说明(需 accessToken:
{applicationId}经DesUtil.decryptTextByUserId(..., getUser().getId())解密;脚本运行时通过AuthTimeServiceManager.getWebUser(request)注入执行用户) - Tag:(未在源码标注)
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 已加密的应用 ID |
| script | body | string | 是(@RequestBody JSONObject 中的 script 键) |
大屏脚本源代码 |
| (request) | — | HttpServletRequest | — | 由 Spring 注入,用于解析 WebUser 与 ParamsTable |
请求体¶
请求示例¶
POST /report/api/bigscreen/applications/__ENC_APP__/executeScript?accessToken=<token> HTTP/1.1
Content-Type: application/json
{ "script": "..." }
响应¶
结构:统一 Resource。data 为脚本返回值(任意类型,可能为 null、字符串、数字、集合、Map 等)。
| errcode | 含义 |
|---|---|
| 0 | 成功 |
| 500 | 脚本执行异常(含解析错误、运行时错误、解密失败等) |
成功示例:
失败示例: