跳转至

Report 模块 API

Report 模块是 MyApps 平台的**报表与 OLAP 服务**(obpm-report),集成 UReport2 与 Mondrian,提供交叉报表(OLAP)MDX 查询、动态交叉报表查询、报表预览、大屏配置获取与大屏脚本执行能力。该模块的 context-path 占位符为 ${myapps.context-path.report:}(部署时替换为具体上下文路径,缺省为空;lite 统一打包下为 /,此时模块路径前缀多一层 /report)。

重要差异OlapController 类级 @RequestMapping("/report") 是**硬编码字面量 /report,**不读取 ${myapps.context-path.report:} 占位符;这与 converter / job / logger 模块使用占位符的写法不同。其方法级路径再叠加在该 /report 之上(如 /report/api/olap/...)。当 report 模块独立部署且 context-path 不为 / 时,前端实际访问路径还需在最前面再加上 servlet context-path。

注:本仓库根 docs/restful-api/index.md「服务与基址」表暂未单独列出 report 行;模块无独立 application*.yml 公开源码(端口由部署侧 server.port 决定)。本模块路径前缀与 URL 模式均以源码为准。

覆盖进度:1 / 1 控制器(已覆盖 OlapController)

Report 模块共有 1 个有端点的控制器,合计 5 个端点。源码树中另有 UReportServlet(由 UreportConfig.buildUreportServlet 注册到 /ureport/*,UReport2 自带 servlet,不在本文档范围)、InitReportCommandLineRunner,初始化数据源与 workspace 监听,无端点)、DataSourceMonitorListenerListenerManagerRegisterUtilReportDataSourceReportWorkspaceApplicationListenerStorageReportProvider 等配置类不单独成文。

已文档化控制器

文件 中文名 基址 端点数
olap.md OlapController(OLAP 交叉报表 / 大屏) /report 5

鉴权说明

(据源码)report 模块**不使用 Spring Security**(全模块无 org.springframework.security 引用),不注册任何 Servlet Filter 或 HandlerInterceptor 做鉴权UreportConfig 注册 UReportServlet/ureport/*、注入 StorageReportProviderInitReportCommandLineRunner;均不参与鉴权)。访问控制完全依赖 obpm-common 提供的共享前置过滤器:

  • PassFilter(obpm-common CommWebMvcConfig.filterRegistrationBeanPassFilter1,order=HIGHEST_PRECEDENCE):命中白名单 URL(模块首页、/health/actuator/health、静态资源后缀 .jpg .js .css .ico .png .gif .html .json .map .woff2 .woff .ttf .eot .svg .mpg .mp4 .mp3 .wav .avi .flv .m3u8 .m3 .ts、magic-api 等)即标记 request.setAttribute("pass", true) 放行。
  • CommonSecurityFilter(obpm-common CommWebMvcConfig.filterRegistrationBeanCommonSecurityFilter1,URL 模式 /*,order=-1):所有模块共享,行为如下——
  • 携带合法 systemToken 请求头(系统间 Feign 调用,JWT 内 username 固定为 systemToken)→ 标记 pass=true 放行;
  • 仅允许 GET/POST/HEAD/OPTIONS 方法,其他方法返回 HTTP 405(HTML 错误页);OPTIONS 为浏览器 CORS 预检放行;
  • Environment.isReady() 为 false 时返回 HTTP 500,响应体「系统正在启动中,请稍后再试!」;
  • /v3/api-docs/swagger-ui/druid 须持有效 designerToken 或 adminToken;/actuator/health 放开;其余 /actuator/** 返回 401(无响应体);
  • 其他请求直接 chain.doFilter不校验业务 accessToken

report 模块所有端点(/report/query/api/olap/report/api/olap/applications/{applicationId}/dynamic/query/{crossReportId}/report/api/applications/{applicationId}/bigscreen/{bigscreenId}/report/api/olap/applications/{applicationId}/olapobject/preview/report/api/bigscreen/applications/{applicationId}/executeScript均不在 PassFilter 白名单内,但因 CommonSecurityFilter 不做 token 校验,HTTP 层可匿名访问

CORS

OlapController 类级标注 @CrossOrigin(origins = "*"),允许任意源跨域访问;配合 CommonSecurityFilterOPTIONS 方法的放行,所有端点均可被浏览器跨域直接调用。

控制器内对用户身份的使用

OlapController.getUser() 通过 AuthTimeServiceManager.getWebUser(request) 解析为 WebUser(依据请求中的 accessToken)。该 userId 用作 DesUtil.decryptTextByUserId(...) 的密钥派生参数,用于解密路径变量 {applicationId}{crossReportId}{bigscreenId}若请求未携带有效 accessTokengetWebUser 返回 null,调用 getId() 将抛 NPE,被 catch 后以 Resource(errcode=500) 返回。executeMdxQuery 不读取用户身份。

完整鉴权机制与错误码说明见:顶层 index.md

响应结构与错误码

report 模块控制器返回**多种响应形态**:

形态一:ResponseEntity<String>(executeMdxQuery)

executeMdxQuery 返回 ResponseEntity<String>,body 为字符串:

  • 成功(200):olapService.executeMdxQuery(mdxQuery) 返回的字符串;
  • 失败(400):纯文本 "MDX查询不能为空"

形态二:统一 Resource(dynamicQuery / bigscreenGet / olapObjectPreview / executeScript)

其余 4 个端点返回 cn.myapps.common.controller.Resource,与顶层 index.md「统一响应结构」一致:

{ "errcode": 0, "errmsg": "ok", "data": <任意>, "errors": null }
errcode 含义
0 成功
404 交叉报表未找到(仅 dynamicQuery
500 业务异常(含 NPE、解密失败、脚本异常等)

错误码补充

report 模块**未引入模块专属业务错误码**(404/500 复用通用语义)。鉴权 / 启动层引入以下与统一 Resource 不同的纯 HTTP 状态码:

errcode / HTTP HTTP 含义
400 400 executeMdxQuery MDX 为空(响应体为纯文本 "MDX查询不能为空"
405 405 HTTP 方法不被允许(由 CommonSecurityFilter 拦截,仅允许 GET/POST/HEAD/OPTIONS,返回 HTML 错误页)
500 500 系统正在启动中(由 CommonSecurityFilterEnvironment.isReady() 为 false 时返回,HTML 错误页)

覆盖说明

本阶段覆盖 obpm-report 工作树下的 OlapController(OLAP 交叉报表 / 大屏,5 个端点,含 MDX 直接查询、动态交叉报表查询、大屏配置获取、OLAP 对象预览、大屏脚本执行)。UReport2 自带的 UReportServlet/ureport/*)不在 REST 文档范围;report 模块有端点控制器已**全部覆盖**。