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,不在本文档范围)、InitReport(CommandLineRunner,初始化数据源与 workspace 监听,无端点)、DataSourceMonitorListener、ListenerManager、RegisterUtil、ReportDataSource、ReportWorkspaceApplicationListener、StorageReportProvider 等配置类不单独成文。
已文档化控制器¶
| 文件 | 中文名 | 基址 | 端点数 |
|---|---|---|---|
olap.md |
OlapController(OLAP 交叉报表 / 大屏) | /report |
5 |
鉴权说明¶
(据源码)report 模块**不使用 Spring Security**(全模块无 org.springframework.security 引用),不注册任何 Servlet Filter 或 HandlerInterceptor 做鉴权(UreportConfig 注册 UReportServlet 到 /ureport/*、注入 StorageReportProvider;InitReport 是 CommandLineRunner;均不参与鉴权)。访问控制完全依赖 obpm-common 提供的共享前置过滤器:
PassFilter(obpm-commonCommWebMvcConfig.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-commonCommWebMvcConfig.filterRegistrationBeanCommonSecurityFilter1,URL 模式/*,order=-1):所有模块共享,行为如下——- 携带合法
systemToken请求头(系统间 Feign 调用,JWT 内username固定为systemToken)→ 标记pass=true放行; - 仅允许
GET/POST/HEAD/OPTIONS方法,其他方法返回 HTTP405(HTML 错误页);OPTIONS为浏览器 CORS 预检放行; Environment.isReady()为 false 时返回 HTTP500,响应体「系统正在启动中,请稍后再试!」;/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 = "*"),允许任意源跨域访问;配合 CommonSecurityFilter 对 OPTIONS 方法的放行,所有端点均可被浏览器跨域直接调用。
控制器内对用户身份的使用¶
OlapController.getUser() 通过 AuthTimeServiceManager.getWebUser(request) 解析为 WebUser(依据请求中的 accessToken)。该 userId 用作 DesUtil.decryptTextByUserId(...) 的密钥派生参数,用于解密路径变量 {applicationId}、{crossReportId}、{bigscreenId}。若请求未携带有效 accessToken,getWebUser 返回 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 | 成功 |
| 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 | 系统正在启动中(由 CommonSecurityFilter 在 Environment.isReady() 为 false 时返回,HTML 错误页) |
覆盖说明¶
本阶段覆盖 obpm-report 工作树下的 OlapController(OLAP 交叉报表 / 大屏,5 个端点,含 MDX 直接查询、动态交叉报表查询、大屏配置获取、OLAP 对象预览、大屏脚本执行)。UReport2 自带的 UReportServlet(/ureport/*)不在 REST 文档范围;report 模块有端点控制器已**全部覆盖**。