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

58 lines
2.8 KiB
Markdown

# conversion overview mysql8 compatibility
## Goal
修复 `adminapi/stats.conversion/overview` 在数据库切换到 MySQL 8.0 后的 SQL 不兼容问题,并在不引入缓存的前提下优化该方法中的慢查询,保证 `dimension=dept``include_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` 更严格,需要重点检查
* 当前文件使用了表名 `order``whereRaw`、多处左连接与聚合,均可能触发 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,重点关注 `hydrateFanStats``include_filters=1` 时的筛选项查询
* 避免引入新的统计口径变化
* 尽量将原生 SQL 改为更稳定的 Builder 写法,或改成 MySQL 8 兼容表达式
## Acceptance Criteria
* [ ] `ConversionLogic` 中不再包含已知 MySQL 8 不兼容写法
* [ ] 关键聚合查询在 MySQL 8 的 `ONLY_FULL_GROUP_BY` 下可通过
* [ ] 至少一个已知慢点的 SQL 结构得到收敛优化
* [ ] 不改变现有接口结构和主要业务语义
* [ ] 至少完成 PHP 语法检查
## Out of Scope
* 其他统计模块(如 `YejiStatsLogic``DoctorDailyStatsLogic`)的整体兼容性修复
* 前端页面样式或交互修改
## Technical Notes
* 目标文件:`server/app/adminapi/logic/stats/ConversionLogic.php`
* 参考日志:`server/runtime/adminapi/log/202604/22.log`
## Research References
* [`research/current-findings.md`](research/current-findings.md) — 当前代码与历史报错线索