跳转至

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 查询语句,不可为空白

请求体

{ "mdx": "SELECT {[Measures].[Sales]} ON COLUMNS, {[Time].[2026]} ON ROWS FROM [SalesCube]" }

请求示例

POST /report/query/api/olap HTTP/1.1
Content-Type: application/json

{ "mdx": "SELECT ... FROM [SalesCube]" }

响应

结构ResponseEntity<String>(非 Resource)。Content-Type: text/plain

成功示例(200):

<Mondrian 查询结果字符串>

失败示例(400,mdx 为空):

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_bartable
showTotalRow boolean 是否显示行汇总
showTotalColumn boolean 是否显示列汇总
olapResult object OLAP 结果(含 axesslicerAxiscellsqueryString,见 OlapResult

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": {
    "title": "销售分析",
    "filters": { ... },
    "reportShowType": "table",
    "showTotalRow": true,
    "showTotalColumn": false,
    "olapResult": {
      "axes": [ { "positions": [ { "members": [ { ... } ] } ] } ],
      "slicerAxis": { ... },
      "cells": [ { ... } ],
      "queryString": "SELECT ..."
    }
  },
  "errors": null
}

失败示例

{ "errcode": 404, "errmsg": "未找到交叉报表,请检查应用与报表标识是否正确", "data": null, "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

请求示例

GET /report/api/applications/__ENC_APP__/bigscreen/__ENC_SCREEN__?accessToken=<token> HTTP/1.1

响应

结构:统一 ResourcedataBigScreen 对象(含大屏组件树、样式、数据源绑定等配置)。

errcode 含义
0 成功
500 业务异常(解密失败、未找到大屏等)

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": {
    "id": "...",
    "name": "销售大屏",
    "components": [ ... ]
  },
  "errors": null
}

失败示例

{ "errcode": 500, "errmsg": "<异常 message>", "data": null, "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": "预览报表", ... }

响应

结构:统一 Resourcedata 结构同 端点 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 注入,用于解析 WebUserParamsTable

请求体

{ "script": "var rows = [];\nreturn rows;" }

请求示例

POST /report/api/bigscreen/applications/__ENC_APP__/executeScript?accessToken=<token> HTTP/1.1
Content-Type: application/json

{ "script": "..." }

响应

结构:统一 Resourcedata 为脚本返回值(任意类型,可能为 null、字符串、数字、集合、Map 等)。

errcode 含义
0 成功
500 脚本执行异常(含解析错误、运行时错误、解密失败等)

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": [ "row1", "row2" ],
  "errors": null
}

失败示例

{ "errcode": 500, "errmsg": "<脚本异常 message>", "data": null, "errors": null }