diff --git a/docs/sw6-to-kra/analytics-source-notes.md b/docs/sw6-to-kra/analytics-source-notes.md index 2b4988d..228e70a 100644 --- a/docs/sw6-to-kra/analytics-source-notes.md +++ b/docs/sw6-to-kra/analytics-source-notes.md @@ -24,6 +24,7 @@ - 使用聚合查询和批量资料查询代替逐行查询,不改变业务口径。日期非法或倒置返回明确错误。 - 数字指标先按全部统计行计算汇总、排序和分页,再补当前页的渠道/游戏名称及商务资料;按渠道名称或渠道类型排序时仍先补全体资料。空页不读取资料,官方及未知渠道标签保持原规则。 +- 需要渠道权限或渠道筛选时,报表通过平台+渠道 ID 的 IN 子查询匹配可见渠道,保留原绑定、层级、名称和类型条件,使 MySQL 5.7 能使用半连接处理。 - 隔离 TCP HTTP 和仓储测试覆盖全量汇总与分页、跨平台同号、官方/孤立渠道、根渠道树去重、类型交集、历史游戏名过滤、当前资料展示、偏好切换及空范围。 - 领域测试覆盖大金额精确排序、分母和人数上限。前端检查筛选回第一页、30 天默认值、汇总不随分页变化、缺数据提示、没有额外导出入口。 diff --git a/internal/data/business/analytics.go b/internal/data/business/analytics.go index f7b4e27..92d3157 100644 --- a/internal/data/business/analytics.go +++ b/internal/data/business/analytics.go @@ -64,7 +64,9 @@ func analyticsQuery(db *gorm.DB, scope business.AnalyticsScope, f business.Analy if scope.Viewer.All && scope.IncludeSub && f.PromoteType == nil && f.PromoteName == "" { return q } - return q.Where("EXISTS (?)", analyticsPromotes(db, scope, f, "p").Select("1").Where("p.source_db=r.source_db AND p.id=r.promote_id")) + // 保留完整的可见渠道筛选,用成对 IN 让 MySQL 5.7 将报表与权限 + // 查询转换为半连接,避免为每条身份记录重新执行相关渠道子查询。 + return q.Where("(r.source_db,r.promote_id) IN (?)", analyticsPromotes(db, scope, f, "p").Select("p.source_db,p.id")) } type analyticsAggPO struct {