跳到主要内容

Report 数据库设计

Report 保存大屏项目、报表数据源配置和 APK 推送历史,并通过 ES 支持历史检索。GoView 可查询的外部数据库不等同于 Report 自有数据库,必须分别记录。

本轮源码核对日期:2026-09-18。本文覆盖 Report 模块所有显式持久化实体:3 个 MySQL DO、2 个 ES 实体;另有 1 个空 TDengine 占位类。主代理于当日 20:51(Asia/Shanghai)只读采集 MySQL 8.0.35 和 Elasticsearch 7.17.6 结构;本页及各业务页已对照该快照,不代表其他环境结构相同。

阅读入口与对象归属​

业务域对象存储与职责文档
GoView 大屏report_go_view_projectMySQL:项目内容、发布状态、角色绑定大屏项目
报表数据源report_data_sourceMySQL:按租户配置外部数据源和资源限制数据源配置
APK 历史apk_push_historyMySQL:历史事实及卸载占位记录;ES:同名检索索引APK 推送历史
积木/动态查询jm_base、JmTdEntity、运行时指定对象ES 实体声明与外部数据库查询边界外部数据源与索引

dal/dataobject/ajreport/package-info.java 仅有占位注释,不构成表;JmTdEntity 无字段和表名注解,不代表已定义 TDengine 表。依赖包带入的积木报表内部表不能按本模块 DO 自动覆盖,发现数据库额外表时另列“仅数据库存在”。

完整实测字段、索引与约束见 ik_yudao_report 物理字典。实际 46 张表中 3 张由本模块 DO 显式映射,其余 43 张见本页后文,不遗漏库内对象,也不把外部依赖表虚构成本模块实体。

数据源、租户与继承​

本地配置资料 doc/数据库设计管理/nacos/report-server.yaml:8 将 master 设为默认源;该文件第 12、17、22 行分别引用 datasource.report.url、datasource.report_prod.url、datasource.td_report.url。doc/数据库设计管理/nacos/datasource.yaml:65 的 report 指向 ik_yudao_report。这证明配置关系,不证明当前进程已加载该文件,也不证明其他源可访问。

本轮指定的 datasource.yaml 缺少 report_prod、td_report,因此这两个别名未解析、未据此连接;不使用其他目录同名配置替代。

连接层名称适用范围
静态 MyBatis 默认源master3 个 MySQL Mapper 未声明 @DS,默认落到 Report 主库
旧 GoView 手动路由mysqlProd、tdengine 等配置别名由旧请求 dataSource 选择,不是物理库名
TDengine MappertdengineTDEngineBaseMapper 的 @DS;实体仍为空占位
新报表数据源report_data_source.id通过租户、启用状态、配置版本确定独立连接资源
ES 全局连接Easy-ES 配置APK 索引查询;与新数据源表中的独立 ES 连接区分

report_data_source 继承 TenantBaseDO,显式包含 tenant_id;report_go_view_project 仅继承 BaseDO,源码没有 tenant_id;apk_push_history 不继承这两个基类,且 report-server.yaml:43 将其列入租户忽略表。不能统一为三张表追加租户/审计字段。

关系与事实边界​

  • report_go_view_project.role_ids 逻辑关联 system 角色 ID,角色有效性通过 RPC 校验;不是本模块维护的关联表。
  • APK MySQL 记录的 id 字段(ORM 标识)作为同名 ES 索引文档 ID;实测表没有 PRIMARY 约束。这是跨存储同步关系,不是外键。
  • report_data_source 的连接 JSON 指向外部存储,外部对象不因此成为 Report 自有表。
  • 实体上的 @KeySequence 为跨数据库兼容声明,不能据此认定本地 MySQL 存在同名序列。
  • 源码中的 SQL 条件说明访问路径,物理索引以本轮元数据为准;本库元数据没有外键约束。

已确认的结构差异​

对象源码与实测对照影响
report_go_view_project12 个持久化 Java 字段全部存在;数据库另有 tenant_id不能以 DO 无租户字段推断物理表无租户字段;实体写入和租户拦截应分开理解
report_data_source21 个字段(含继承)全部存在,无额外列uk_tenant_code(tenant_id,code) 不含逻辑删除标记,删除后编码仍被唯一键占用
apk_push_history7 个实体字段全部存在;数据库另有 2 个虚拟生成列实际幂等唯一键使用生成列归一化空值,实体不负责写这些列
apk_push_history@TableId 表示 ORM ID;数据库没有 PRIMARY,而有 UNIQUE id(id,mac,cpuid)不能将 Java id 注解写成“数据库单列主键”
ES apk_push_history实测 7 个字段与实体对应text/keyword 多字段、分词器和日期格式已核对
ES jm_base实体有声明,本次开放索引及返回别名未发现保留源码设计字典;不扩大为 closed 索引或其他环境也不存在

仅数据库存在的 43 张表​

这些表的完整字段、类型、索引已纳入物理字典。分类依据名称和数据库注释,不据此断言它们仍被运行时使用,也不执行清理。

分组数量实际表名
APK 旁支表2apk_push_history11111、apk_push_history_new
会员统计命名组8huiyuan_age、huiyuan_fengongsi、huiyuan_huoyuedu、huiyuan_sex、huiyuan_work、huiyuan_wxtl、huiyuan_wxtlshuliang、huiyuan_xueli
积木报表14jimu_dict、jimu_dict_item、jimu_report、jimu_report_category、jimu_report_data_source、jimu_report_db、jimu_report_db_field、jimu_report_db_param、jimu_report_export_job、jimu_report_export_log、jimu_report_icon_lib、jimu_report_link、jimu_report_map、jimu_report_share
拖拽仪表盘8onl_drag_comp、onl_drag_dataset_head、onl_drag_dataset_item、onl_drag_dataset_param、onl_drag_page、onl_drag_page_comp、onl_drag_share、onl_drag_table_relation
示例命名组5rep_demo_dxtj、rep_demo_employee、rep_demo_gongsi、rep_demo_jianpiao、rep_demo_xiaoshou
测试命名组4test_customer、test_order、test_order_pros、test_resume
临时命名组2tmp_report_data_1、tmp_report_data_income

源码根目录:ik_project/yudao-cloud/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/。各业务页给出具体文件和行号。

外部数据源与积木索引​

Report 的数据库设计包含“本服务保存什么”和“允许从哪些外部存储读取”两层。GoView 查询模板指定的库、表、ES 索引或 Redis 键是外部对象,不会自动形成 Report 本地 DO。

动态数据读取关系​

Mermaid Diagram Code:

flowchart LR
    C[报表查询请求] --> D[按租户和版本加载 report_data_source]
    D --> V[模板编译与只读校验]
    V --> R[独立连接资源]
    R --> M[MySQL]
    R --> T[TDengine REST]
    R --> E[Elasticsearch]
    R --> K[Redis]

新数据源查询仅使用本租户保存且启用的数据源 ID,校验 configVersion 后绑定参数、编译只读查询,再在查询期限内执行。调用者不能在该查询请求里临时替换目标地址和数据源类型。

存储当前实现方式对设计字典的含义
MySQLReportDataSourceResourceFactory 创建独立 Druid 池;关闭多语句和本地文件载入表结构须从明确目标库元数据获取,查询结果列不是完整 DDL
TDengine独立 Apache HTTP 池,POST /rest/sql/{database}超级表、普通列、TAG 和子表关系须独立采集
ES独立 RestClient;DSL 请求固定 POST /{index}/_search,标准 SQL 走 Calcite完整字段、子字段和分析器以 _mapping 为准
Redis独立 Redisson 客户端及配置的逻辑库;键来自查询参数不存在固定关系表,不能凭服务支持命令编造键空间

来源:ik_project/yudao-cloud/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/service/datasource/ReportDataSourceQueryService.java:24;同模块 framework/datasource/ReportDataSourceResourceFactory.java:24、framework/datasource/ReportTdengineResource.java:32、framework/datasource/ReportEsQueryExecutor.java:19、framework/datasource/ReportRedisQueryExecutor.java:18。

旧 GoView JDBC 服务通过 DynamicDataSourceContextHolder 切换别名,再从查询结果取得列名;旧 ES DSL 服务调用 Easy-ES executeDSL,其实现含结果日志。它们可说明既有连接方式,不应作为全量结构采集器直接运行。CalciteElasticsearchService.getTableColumns 通过 DatabaseMetaData.getColumns 只取列名,不能代替 ES mapping。

对应源码:ik_project/yudao-cloud/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/service/goview/GoViewMysqlDataServiceImpl.java:35、GoViewTDEngineDataServiceImpl.java:33、GoViewEsDataServiceImpl.java:64、CalciteElasticsearchService.java:40(后三者与首个文件同目录)。

jm_base:源码声明,本次开放索引范围未发现​

JmEsEntity 声明 @IndexName("jm_base"),描述设备基础信息的检索模型。本次 2026-09-18 的开放索引及返回别名未发现 jm_base,因此以下为源码设计字典,不是已核验存在的 mapping;未覆盖 closed 索引或其他环境,也不将另一个名为 base_device 的索引自动认作同一对象。

来源:ik_project/yudao-cloud/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/dal/dataobject/jimu/JmEsEntity.java:23。本类实现 Serializable,无继承持久化字段。未显式注解的字段保留 Java 类型,不推断 ES 自动 mapping。

Java 字段(预期下划线名)Java 类型源码 ES 注解业务语义 / 声明行
idLongLONG,CUSTOMIZE ID设备标识 / 30
macStringKEYWORD_TEXT,MAC_ANALYZERMAC 检索 / 34
statusIntegerINTEGER状态,枚举未在本类定义 / 37
certificationStringKEYWORD认证标识 / 40
userId(user_id)Long未显式指定用户关联标识 / 42
companyId(company_id)Integer未显式指定公司关联标识 / 44
channelId(channel_id)Long未显式指定渠道关联标识 / 46
channelName(channel_name)StringKEYWORD_TEXT,IK_MAX_WORD渠道名 / 49
deviceModel(device_model)StringKEYWORD_TEXT,IK_MAX_WORD设备型号名称 / 52
modelId(model_id)Integer未显式指定型号关联标识 / 54
orderNumber(order_number)StringKEYWORD订单编号 / 57
sdkVersionName(sdk_version_name)StringKEYWORD_TEXT,STANDARDSDK 版本 / 60
createTime(create_time)Date未显式指定创建时间 / 62
updateTime(update_time)Date未显式指定更新时间 / 64
remarksStringKEYWORD备注 / 67
activationTime(activation_time)Date未显式指定激活时间 / 70
nameStringKEYWORD_TEXT,STANDARD设备名称 / 73
brandStringKEYWORD品牌 / 76
systemVersion(system_version)StringKEYWORD_TEXT,STANDARD系统版本 / 79
buildStringKEYWORD_TEXT,STANDARD构建信息 / 82
ddrStringKEYWORD内存描述 / 86
cpuStringKEYWORDCPU 描述 / 89
deviceIp(device_ip)StringKEYWORD_TEXT,STANDARD设备 IP 文本 / 92
regionId(region_id)Long未显式指定地区关联 ID / 97
ipAddress(ip_address)StringKEYWORD_TEXT,IK_MAX_WORDIP 地址描述 / 102
uiStringKEYWORD_TEXT,IK_MAX_WORDLauncher 包名,多个使用英文逗号 / 118
serialNumber(serial_number)StringKEYWORD序列号 / 121
deletedBoolean未显式指定删除标志 / 126

其中用户、公司、渠道、型号和地区 ID 仅体现逻辑关联意图,没有本模块外键约束。platform、params 仅存在于注释,不纳入字段清单;静态 serialVersionUID 也不持久化。本模块没有查到绑定 JmEsEntity 的实际 Mapper,不能仅凭实体声明认定仍有读写流量。

TDengine 占位与采集边界​

JmTdEntity 只有空类,未声明 @TableName、时间戳列、普通列或 TAG;TDEngineBaseMapper 使用 @DS("tdengine") 且忽略租户拦截。EsBaseMapper 泛型同样指向这个空类,它服务于原始 DSL 查询,不能据此自动生成 ES/TDengine 表设计。

来源:ik_project/yudao-cloud/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/dal/dataobject/jimu/JmTdEntity.java:9、同模块 dal/tdengine/TDEngineBaseMapper.java:16、dal/es/EsBaseMapper.java:15。

指定 Nacos 资料缺少 datasource.td_report 和 datasource.report_prod 定义,不能确认 Report 专属 TDengine 库或生产查询源。主代理若采集到其他微服务的 TDengine 对象,它们仍按所属服务归档;本页不将其他库的超级表补写为空实体的设计。

新版 ReportTdengineResource.java:19 明确避开 TAOS-RS 3.7.3 的全局静态 HTTP 池,使用独立连接池;这说明采集程序可参考独立 REST 方式,不需要启动 Report 服务。既有报表只读编译器是查询安全边界,结构采集使用单独只读入口,不应为导出结构放宽产品接口。

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答