Launcher 源码映射与结构差异
下表列全当前 Launcher DO 的持久属性,以数据库列名表达;除明确说明的例外外,Java 使用对应 camelCase 名称。这样既可从业务说明理解用途,也能逐项核对代码是否与实库相符。类型、默认值、长度及索引详见物理字典。
MySQL 实体完整映射
LauncherBaseInfoDO 和 LauncherIndexDO 继承 BaseDO,共同增加 creator, create_time, updater, update_time, deleted 五列;其余 MySQL DO 不继承该基类。以下显式字段加这组继承字段即为完整 Java 持久字段,不给普通 DO 自动补上租户或审计字段。
| 实体 / 表 | 显式持久字段 | 继承和特殊映射 |
|---|---|---|
LauncherBaseInfoDO / launcher_base_info | id, name, package_name, remarks, version_code, valid, bpm_status, process_instance_id, draft | 继承 BaseDO;draft 用 BpmDraftTypeHandler,实体开启 autoResultMap |
LauncherIndexDO / launcher_index | id, base_info_id, index, version, enable, valid, remarks, group | 继承 BaseDO;index/group 显式加反引号映射 |
LauncherIndexAdvertDO / launcher_index_advert | id, index_id, type, url, size, app_url, app_size, app_package_name, app_version_code, app_version_name, enable, app_id, resource_id, info, valid, remark, draft | 无继承审计字段;draft 用 BpmDraftTypeHandler,实体开启 autoResultMap |
LauncherAdvertPushTaskDO / launcher_advert_push_task | id, advert_id, push_task_id | 无继承字段 |
LauncherIndexChanelDO / launcher_index_chanel | id, index_id, chanel_id, valid | 无继承字段 |
LauncherIndexMacDO / launcher_index_mac | id, index_id, mac, valid | 无继承字段 |
LauncherIndexRegionDO / launcher_index_region | id, index_id, region_id, valid | 无继承字段 |
LauncherAdPlayCountDO / launcher_ad_play_count | id, type, package_name, ad_index_id, play_count, play_duration, record_time, version_code, create_time, update_time, ad_play_type | 仅实现 Serializable;静态常量与 serialVersionUID 不落库;版本 getter 处理 -99999 |
上述 8 个实体对应 8 张实表,未发现源码指向但本次采集缺失的 MySQL 表或列。额外列和长度范围差异见下表,不由此推断数据错误或立即执行迁移。
TDengine 实体完整映射
| 实体 / 数据源 | 普通持久字段 | TAG 与特殊字段 |
|---|---|---|
LauncherExecRecordDO / tdLauncherExec | ts, data_key, mac, cpu, d_time, create_time | TAG:ad_resource_id, type;tbname 为特殊表名字段,代码标为输入型 TableId,不能解释成物理业务主键列 |
LauncherAdPlayDetailDO / tdLauncherAdPlayDetail | begin_time, data_key, mac, cpu, end_time, play_duration, create_time, log_info | TAG:time_tag, package_name, version_code, ad_index_id, ad_play_type, partition_index;tbname 为特殊表名字段 |
LauncherAdPlayDeviceCountDO / 日、月、年三个数据源 | record_time, data_key, mac, cpu, play_duration, play_count, create_time | TAG:package_name, version_code, time_tag, ad_index_id, ad_play_type;tbname 为特殊表名字段 |
3 个 DO 均不继承 BaseDO,不应人为追加审计人、逻辑删除和租户列 。源码未在这 11 个 DO 中发现 @TableField(exist=false) 属性;tbname 通过 TDengine 语义处理,而不是遗漏的普通列。getRecordTimeStr() 是计算方法,不是独立持久属性。所有普通列与 TAG 名均在对应实测超级表中找到。
差异、演进与兼容清单
| 编号 | 现状与源码对照 | 对业务理解的影响 / 后续核实方向 |
|---|---|---|
| L-01 | launcher_base_info、launcher_index 实库各有 tenant_id,DO 只继承 BaseDO | 实体未声明不代表租户拦截器不生效;以公共框架边界及实际租户配置理解,不建议直接删列 |
| L-02 | launcher_index 实库还有 JSON draft,当前 DO 没有对应属性;主配置、素材仍映射草稿 | 与广告位当前主要更新状态/备注的代码形态并存;只能确认本模块当前 DO 不映射该列,不能证明历史草稿可删除 |
| L-03 | launcher_ad_play_count 实库有 creator, updater, deleted,DO 未声明;XML 明确插入/更新 deleted | 不能因 DO 未声明就认为 deleted 完全无使用;该 DO 也没有继承 TableLogic 字段,不能声称所有查询自动过滤 deleted |
| L-04 | launcher_index(base_info_id,index,group) 的唯一性由服务查询校验,实库没有对应唯一索引 | 业务规则与物理约束保障强度不同;记录现状,不在本次自动建索引 |
| L-05 | valid 的表/实体注释通常停在 0–3,共享枚举及素材代码已使用 4、5 | 字典应解释启用/禁用待审批标记;这是注释滞后,不是数据越界证据 |
| L-06 | Java 中 launcher_base_info.id 为 Long,实库为 int;素材 size/app_size/app_version_code 为 Long,实库为 int;TD 明细 ad_index_id 为 Long,实库 TAG 为 INT | 表达范围不一致;本次没有读取数据,不能判断已有截断或溢出,变更字段范围应另行评估上下游 |
| L-07 | 执行 DO 注释称子表按 MAC/CPU,实际 getter 为 ler_{adResourceId}_{type};Mapper 包名是 mysql,但 DS 是 TDengine | 以实际路由和 getter 描述存储,不能据旧注释创建一张 MySQL 执行表 |
| L-08 | 统计 DO 注释示例偏向完整日期,月/年作业分别写 yyyyMM、yyyy;明细已加入 partitionIndex 与分类兼容段 | 分区、统计周期和分类是后续业务演进,需要从调用处解释,不能只读字段注释 |
| L-09 | MySQL 统计版本用 -99999 空值兼容;TD 子表在默认分类时省略分类段 | 保存既有兼容语义。历史名称、哨兵值不自动判为脏设计 |
| L-10 | 规则投放与旧渠道/MAC/地区分支同时存在,infra 系统配置优先于 Nacos 注入值 | 此次确认可选路径,不确认线上启用状态;旧关系表未标为废弃 |
| L-11 | 实时广告分支统一设第三方分类并进行德国时区转换;另有直接写日统计的路径 | 同一统计表的数据来源并非完全相同,解释统计差异时需先确认包名、分类和上报路径,不能强求明细与日统计逐行对应 |
| L-12 | MySQL 汇总唯一键含可空 ad_play_type 和 version_code;批量 XML 只对版本做 COALESCE | 索引存在并不覆盖所有 NULL 语义 下的业务去重;实际重复情况未扫描,不作数据质量结论 |
| L-13 | 素材 type 注释为 0 视频、1 图片、2 网页、3 其它,当前 AdTypeEnum 返回 video/image/fav/text | 对外协议枚举已有具体语义,文档保留注释差异;不能只从字段注释解释当前客户端行为 |
关联与证据索引
| 关系 | 精确语义 | 代码证据(路径根见首页) |
|---|---|---|
| Launcher → infra | resource_id/app_id 对应文件 ID,保存时读取并带入元数据 | service/padvert/LauncherIndexAdvertServiceImpl.java:59,66 |
| Launcher → device | 下发时取设备属性,并可异步更新 device UI 信息 | controller/app/ForeignLauncherController.java 的 getLauncherAds/updateUI |
| rule → Launcher | LAUNCHER_PUSH 的 businessId 是 launcher_index.id | listener/RuleLauncherStatusListener.java:16,44 |
| Launcher ↔ bpm | 主配置 ID 为 businessKey,主表保存流程实例 ID;结果由监听器交回业务服务 | service/push/LauncherBaseInfoBpmServiceImpl.java:152,171;listener/BpmLauncherStatusListener.java |
| Launcher ↔ task | push_task_id 关联 task 推送业务,先查素材再汇总执行回传;导出任务由 task 管理 | service/execrecord/LauncherExecRecordServiceImpl.java:76,109;listener/LauncherExportTaskEventListener.java:46 |
| Launcher → 安装回执消息 | type=2 时从素材补 包名、版本,再发 TOPIC_FROM_LAUNCHER | controller/app/ForeignLauncherController.java 的 addLauncherExecRecord |
以上均为逻辑关系;本次实库 8 张 MySQL 表未检出物理外键。核验以 2026-09-18 结构快照和当前源码为准,没有据元数据推断业务数据是否孤立、统计是否完整、审批是否一致或线上代码版本。