业务演进、结构差异与待确认事项
这些差异来自当前源码与 2026-09-18 测试环境元数据对照。它们不是自动迁移或清理清单:正常演进、历史兼容、框架参与、环境缺口和潜在映射问题必须分开理解。本次没有扫描业务数据,也没有验证生产环境。
首先保留的业务背景
nebula_ids是原单体 MySQL 库。device、task 已有独立库,仍存默认库依赖、跨库 SQL 和部分旧对象,不应写成“两个服务只有一个共享库”。- 规则投放与旧渠道/MAC/地区关系在若干服务中共存。是否走旧分支受配置影响,不能因为新逻辑存在就删去旧关系说明。
- 审批有效态、素材类型、黑名单类型等注释滞后于枚举和调用逻辑。文档解释当前实现,并保留旧注释冲突,不据此认定数据库中的值已损坏。
- 实库多出字段或表,可能来自租户框架、第三方依赖或旧版本。先核对读写者,再讨论维护;本轮不实施结构变更。
需要优先理解的映射与约束差异
| 范围 | 已确认现象 | 业务影响与核验边界 |
|---|---|---|
| task 应用活跃汇总 | AppActivityCountDO 声明 beginDate/endDate 且未排除持久化,实表没有 begin_date/end_date,另有 country | 自动生成 SQL 可能引用不存在的列;应在后续业务验证中检查实际调用路径,本轮未执行 CRUD |
| device MAC 类型 | DeviceMacTypeDO 的表注解指向 base_device,自定义 SQL 实际访问 device_mac_type;前者没有 type | 自定义查询和通用 Mapper 的对象解释不同,不能把两张表合为一个设计 |
| device 应用安装 | app_install_package 系列表未在本次目标库中找到;实测有统计表与部分设备月表 | 可能涉及动态创建时机、环境或遗留代码,不能仅据缺失认定业务失败 |
| device ES 安装月索引 | 较新月份部分时间、CPU 字段为 text,较早月份为 date/keyword;另有月份混合驼峰/下划线字段 | 相同实体不保证所有历史索引结构一致,跨月过滤/排序要考虑索引差异;未运行业务查询 |
| report APK 历史 | 实表没有 PRIMARY;id 是 (id,mac,cpuid) 复合唯一键,两列虚拟生成值参与另一个幂等唯一键 | ORM 的 @TableId 不等于数据库单列主键;空值占位和 ES 文档 ID 应按当前实现说明 |
| report 数据源编码 | uk_tenant_code(tenant_id,code) 不含 deleted | 逻辑删除仍可能占用租户内编码,不能把删除理解为物理释放 |
| launcher 业 务唯一性 | 广告位组合唯一由服务查询校验,实库无对应唯一索引 | 业务约定和数据库约束的保障程度不同,不能宣称数据库防止了所有重复 |
| rule 业务唯一性 | 规则链名称/编码由源码校验;business_limit 的组合索引为非唯一 | 应区分匹配逻辑与唯一约束;本次不新增索引 |
| rule 覆盖数量与限额 | rule_device_count 是部分条件初筛数量;当前业务类型的 hasCountLimit 均为 false | 数量不能写成全部 EL/地区条件执行后的最终命中数;存在限额代码也不代表当前已强制启用 |
| task 与 rule 的 UOTA 域解绑 | 查询采用 DOMAIN_DISPATCH_UOTA,DomainUotaAppServiceImpl 的解绑调用使用 DOMAIN_DISPATCH | 业务域上下文存在静态不一致,记录后续定向核验项,本轮不修改代码、不推定已经解绑失败 |
| bpm 业务唯一性 | 9 张业务表仅采集到主键,未有 message_key/process_definition_id 等业务唯一索引 | 不能把业务幂等键描述为数据库强制唯一;框架表的外键另行记录 |
| bpm 抄送字段 | 单 taskId 重载传给下一重载的活动名称、任务 ID 参数位置存在静态不一致 | 可能影响该路径写入的字段含义;已在 BPM 核验页给出行号,未读取历史内容判定实际影响 |
逐字段映射、具体索引、源码位置及更多差异以各服务业务页为准:device、task、report、launcher、rule、bpm。
注释与现行业务含义
| 领域 | 旧描述与现行逻辑的差别 | 当前文档采用的解释 |
|---|---|---|
| 任务/桌面/黑名单 valid | 旧注释未完整反映当前共享枚举,部分修改/移除含义相反 | 以 BpmBusinessValid 和业务调用表达未生效、生效、待修改/移除及启用/禁用标记 |
| task V2 下发 | 历史 taskType 类型说明不能代表 V2 所有能力 | 当前 V2 响应外层固定 taskType=1,按具体接口解释 |
| launcher 素材类型 | 注释仍有“网页/其它”等旧定义 | 当前 AdTypeEnum 为 video/image/fav/text,具体取值见服务页 |
| blacklist type | DO/数据库注释与枚举的卸载/杀死取值相反 | 以当前 BlacklistedTypeEnum 的 0=卸载、1=杀死解释代码 |
| report 推送历史 | 实体旧注释称“只保留最新版本” | 当前实现保留以版本与推送时间区分的多条历史,并有卸载先到的占位处理 |
| launcher 动态表 | 旧注释描述的分表维度不完整 | 用 getter、Mapper 和统计作业解释广告资源、周期、分类及历史兼容命名 |
这里只纠正文档解读,不改实体注释或数据库 comment。实际存量值是否遵循哪一时期定义,需要另一项有业务数据授权的核验,本次未推断。
额外对象与框架列
| 范围 | 实库与源码对象覆盖 | 处理方式 |
|---|---|---|
| system | 32 实表全部有对应实体;另有 12 个 tenant_id 和 operate_log.success 未由对应 DO 声明 | 租户字段结合插件说明;success 保留为未映射列 |
| infra | 21 实表中 18 张对应当前实体;另有 infra_job、infra_job_log、infra_region | 额外 3 表归属未核验;10 表 tenant_id、file_config.cdn_config 另列,不自动删除 |
| report | 46 实表中 3 张由当前模块显式 DO 映射 | 其余 43 张按第三方报表、示例、测试命名及未确认对象分类;不把“没有本地 DO”当成完全无使用 |
| launcher | 8 实表全部有对应实体,无缺失源码列 | index.draft、部分 tenant_id 和统计审计列额外存在;deleted 仍有 XML 使用,不能说完全无读写 |
| task 独立库 | ik_yudao_task 8 实表,7 张有当前 DO | task_flow_uota_download 尚未确认当前映射;其他遗留与统计库详见 task 页 |
| blacklist | ik_apk 7 实表,5 张有当前 DO | app_uninstall_detail、flow_blacklisted_flow 归属待确认;主表额外 release_info、flow_status、tenant_id |
| bpm | 56 实表,由 9 张业务表与 47 张引擎表构成 | 46 条物理外键属于实际框架约束;业务表额外 tenant_id 及两个触发设置列另述 |
| rule | 12 实表与 12 个实体对应,未发现映射列缺失 | 5 表额外 tenant_id,MAC 资源关联表额外 create_time;不直接清理 |
device 涉及固定对象、地区 XML、动态安装月表与 ES,不能把实体数量直接当作物理表数量,其覆盖与额外对象在 device 总览及实测字典单列。
配置缺口与未在线核验的范围
提供的配置未定义 td_api_visit、report_prod、td_report 三个引用。额外采集 monitor 成功,只证明指定测试实例中该结构存在,不证明 system 路由配置正确。report 的 jm_base 在本次开放索引及返回别名中未找到,不能扩大为所有环境、closed 索引都不存在。
BPM 回调消息的根记录状态由回执更新,不是所有消费者子记录的汇总成功标志。排查审批已通过但业务未生效时,需要分别看流程状态、业务有效态及各服务补偿记录,详见 BPM 回调流程。
Redis 实际键值与 TTL、SLS 云索引、运行时配置优先级、消息交付、审批补偿、ES 同步和定时统计未在线执行验证。各业务页的代码路径不等价于这些任务当前已启用。所有成功/失败与覆盖边界见采集说明。