跳到主要内容

Launcher 配置、素材与投放关系

运营配置以“哪个 Launcher、哪些版本、哪个广告位、下发什么内容”为主线。主配置管理包名与版本范围,广告位管理位置、分组和生效版本,素材行保存视频、图片及其他类型素材和关联 APK 的下发内容。把三层分开后,同一个 Launcher 可以有多个广告位,同一位置可以按不同组保存不同配置,每个广告位还可以保留多个素材候选。

从配置到设备下发​

  1. 管理端创建 launcher_base_info,并创建或添加 launcher_index。广告位的业务唯一范围是 base_info_id + index + group,空组名由服务设为 default。
  2. 在 launcher_index_advert 选择素材和 APK。通过 infra FileApi 取得文件地址、大小、包名与版本,复制到素材配置行,减少设备下发时重新拼装资源信息的需要。
  3. 需要审批的编辑保存生效值及待审批草稿/标记。提交时用主配置 ID 作为 BPM businessKey;审批回调更新配置及关联项,清理下发缓存。无审批操作由相应 NoBpmServiceImpl 处理。
  4. 设备按 MAC/CPU 查询 device 属性,结合包名、版本请求广告。规则模式以 LAUNCHER_PUSH 匹配广告位 ID,再与包名、版本的有效配置缓存求交集;同一位置存在多个候选时按源码中的启用状态和版本比较选择。
  5. 下发返回的位置编号 id、广告位记录 adId、素材记录 adResourceId 含义不同。后续执行反馈使用素材记录 ID,不能拿它直接查 infra 文件表。

写入者是管理端服务、审批回调和规则状态监听器;主要读取者是设备下发接口及管理端查询。证据:service/push/LauncherBaseInfoServiceImpl.java:105,395,647、service/padvert/LauncherIndexAdvertServiceImpl.java:52、service/push/LauncherBaseInfoBpmServiceImpl.java:152、controller/app/ForeignLauncherController.java:93。

表分工与关键字段​

表业务含义关键字段与关系
launcher_base_info一套 Launcher 投放配置package_name 为客户端包名;version_code 是逗号分隔的适用版本集合,不是单个数值版本;bpm_status/process_instance_id 连接审批;draft 保存主配置待审批变化
launcher_index主配置下的一处广告位及分组base_info_id 指向主配置;index 是位置编号;group 区分同位置配置;version 是配置版本时间戳,与 APK 的版本号不同;enable 是开关,valid 是生效/待处理状态
launcher_index_advert广告位中的具体素材及关联 APKindex_id 指向广告位;resource_id/app_id 引用 infra 文件;url/size 和 app_* 是保存时带入的资源信息;draft 是待审批变更;info 是业务附加信息
launcher_advert_push_task素材与推送任务的关联advert_id 指素材配置 ID,push_task_id 指 task 业务的推送任务 ID;用于按任务汇总 Launcher 安装反馈
launcher_index_chanel旧投放分支的渠道范围index_id 指广告位,chanel_id 为渠道 ID;表名和列名保留历史单写 n 的拼写
launcher_index_mac旧投放分支的指定设备范围index_id + mac 关联广告位与 MAC;此处没有 CPU 列,不能当成严格的 MAC+CPU 设备集合
launcher_index_region旧投放分支的地区范围index_id + region_id 关联广告位与地区;地区 ID 来自设备属性所使用的业务编码

全部持久字段见源码映射,字段类型和物理约束见 MySQL 字典。

适用版本不是“最低版本”或模糊匹配:设备有版本号时,需要精确命中主配置逗号列表中的一个值;设备没有版本号时,只匹配版本列表为空的配置,空列表不是所有版本通用的兜底。素材类型下发采用当前 AdTypeEnum:0=video、1=image、2=fav、3=text,其中后两项与实体注释里的“网页、其它”并不完全相同,应以协议枚举和调用方使用为准。

审批状态与业务变化​

enable、valid、bpm_status 不能合并理解成一个开关:enable 决定是否启用,valid 描述正式数据与待审批变更的关系,bpm_status 描述流程运行状态。实体注释和实库注释主要列出 valid=0..3,当前共享枚举还定义了 4(启用标记)和 5(禁用标记),广告素材启停代码确实使用这两个状态。

BpmDraftTypeHandler 序列化主配置和素材的草稿 JSON。已生效数据修改时,不能简单认为页面填写的新值已经成为设备获取的正式值。LauncherUtil.updateIndexAdvertEnable* 会处理同广告位其他素材的启停或草稿标记,业务意图是同广告位只下发一个启用素材;本次物理字典没有提供保障该条件的唯一索引。

规则中心变更以广告位 ID 通知 Launcher,由 RuleLauncherStatusListener 回溯到主配置并重置审批状态。审批业务主键是主配置 ID,而规则绑定业务主键是广告位 ID,这一层级差异是跨服务排查的重要入口。

证据:util/LauncherUtil.java:164,242;listener/RuleLauncherStatusListener.java:16,44;共享枚举位于 ik_project/yudao-cloud/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/business/BpmBusinessValid.java:18。

规则主流程与旧范围表​

ForeignLauncherController 根据 LauncherConfig.isRuleEnable() 选择规则或旧分支。配置读取优先使用 infra 系统配置 launcher.rule.enable,为空或读取异常时回退到注入配置,代码默认值为 false。因此“存在旧范围表”不等于线上只使用旧方式;“有规则引擎代码”也不等于已确认当前环境启用。

规则分支的主线是 RuleRunUtil.matchBusinessIds(LAUNCHER_PUSH, device)。旧渠道、地区、MAC 表属于兼容分支及既有审批/清理逻辑,仍有 Mapper 和服务使用,不能仅凭业务迁移就标注为可删除。配置删除由服务同时处理子关系和 rule 解绑,MySQL 没有自动级联外键。

旧分支先合并 MAC、渠道、地区匹配到的广告位;如果广告位配置了地区范围,还要求地区命中且渠道或 MAC 至少命中一项。它不是把三张关系表简单解释为三个独立任选条件。证据:service/push/LauncherBaseInfoServiceImpl.java:535,574,759。

约束与缓存​

  • 实库对 launcher_index_chanel(index_id,chanel_id)、launcher_index_mac(index_id,mac)、launcher_index_region(index_id,region_id) 及 launcher_advert_push_task(advert_id,push_task_id) 建有唯一键。
  • launcher_index 实库只有主键,组内位置唯一性目前在 createIndex 中查询校验;文档不把服务校验写成数据库唯一约束。
  • launcher:index:{packageName} 或 launcher:index:{packageName}:{versionCode} 缓存广告位集合,Hash 字段是广告位 ID。缓存缺失时回源 MySQL,配置变更执行失效和本地缓存清理,部分路径采用间隔 300ms 的双删。
  • 旧 MAC 条件缓存在公共设备 Hash 的 launcherIndexId 字段;渠道、地区使用对应集合缓存。这里只确认源码结构,没有扫描实际 Redis key/value。

证据:dal/redis/LauncherRedisDAO.java、service/push/LauncherBaseInfoServiceImpl.java:736 及本次 MySQL 索引、外键采集。

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