Files
zyt/.trellis/tasks/archive/2026-05/05-07-conversion-overview-mysql8/prd.md
T

2.8 KiB

conversion overview mysql8 compatibility

Goal

修复 adminapi/stats.conversion/overview 在数据库切换到 MySQL 8.0 后的 SQL 不兼容问题,并在不引入缓存的前提下优化该方法中的慢查询,保证 dimension=deptinclude_filters=1 场景可正常且更快地查询。

What I already know

  • 主逻辑在 server/app/adminapi/logic/stats/ConversionLogic.php
  • 运行日志里已有一条 MySQL 语法错误记录: SQLSTATE[42000]: Syntax error or access violation: 1064 ... near '( q.follow_admin_ids, '$[*]' COLUMNS (...)'
  • 当前 ConversionLogic.php 已不再包含 JSON_TABLE,说明兼容修复可能做过一半,仍需核对当前文件中的 MySQL 8 风险点
  • 当前文件仍有多处 fieldRaw + group 聚合查询,MySQL 8 默认 ONLY_FULL_GROUP_BY 更严格,需要重点检查
  • 当前文件使用了表名 orderwhereRaw、多处左连接与聚合,均可能触发 MySQL 8 兼容性问题
  • 历史运行日志显示慢点主要集中在:
    • hydrateFanStats,多次达到 0.7s ~ 2.4s
    • include_filters=1 时的 buildFilterOptions -> DiagnosisLogic::getAssistants,曾到 18s+

Assumptions (temporary)

  • 当前用户提到的“不兼容”针对的是 stats.conversion/overview 当前版本,不要求顺带修复其他统计模块
  • 优先修复服务端 SQL 兼容性,并优化 SQL 结构,不改接口出参结构
  • 若发现旧版遗留的 JSON_TABLE 逻辑已被替换,则以当前代码中的聚合、NULL 比较、保留字、原生 SQL 片段为修复重点

Open Questions

  • 无。已有日志和代码足够开始修复。

Requirements

  • 审查并修复 ConversionLogic.php 中 MySQL 8.0 不兼容 SQL
  • 保证 overview?page_no=1&page_size=15&dimension=dept&media_channel_code=&time_type=today&include_filters=1 可执行
  • 优化该接口中的主要慢 SQL,重点关注 hydrateFanStatsinclude_filters=1 时的筛选项查询
  • 避免引入新的统计口径变化
  • 尽量将原生 SQL 改为更稳定的 Builder 写法,或改成 MySQL 8 兼容表达式

Acceptance Criteria

  • ConversionLogic 中不再包含已知 MySQL 8 不兼容写法
  • 关键聚合查询在 MySQL 8 的 ONLY_FULL_GROUP_BY 下可通过
  • 至少一个已知慢点的 SQL 结构得到收敛优化
  • 不改变现有接口结构和主要业务语义
  • 至少完成 PHP 语法检查

Out of Scope

  • 其他统计模块(如 YejiStatsLogicDoctorDailyStatsLogic)的整体兼容性修复
  • 前端页面样式或交互修改

Technical Notes

  • 目标文件:server/app/adminapi/logic/stats/ConversionLogic.php
  • 参考日志:server/runtime/adminapi/log/202604/22.log

Research References