From 4b573d3981658e2ed31e4ce7a18982a4415bf5b9 Mon Sep 17 00:00:00 2001 From: zhouyonggao <1971162852@qq.com> Date: Thu, 18 Dec 2025 23:39:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(exports):=20=E4=BF=AE=E6=AD=A3=20creator=5F?= =?UTF-8?q?in=20=E8=BF=87=E6=BB=A4=E6=9D=A1=E4=BB=B6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 调整在 marketing 数据集的 order 或 order_info 主要表时, 当存在 plan_id_eq 或 reseller_id_eq 过滤参数,不设置 creator_in - 在 mergePermissionIntoFilters 函数中,传递了 plan_id_eq 或 reseller_id_eq 时, 删除已有的 creator_in 和 creator_ids 过滤,避免重复过滤 - 优化过滤逻辑,确保在特定条件下 creator_in 不会被错误附加 - 保留当 creator_in 已经存在且非空时的过滤行为不变 --- server/internal/api/exports.go | 49 +++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/server/internal/api/exports.go b/server/internal/api/exports.go index 8d904f3..ab6f10b 100644 --- a/server/internal/api/exports.go +++ b/server/internal/api/exports.go @@ -118,22 +118,20 @@ func (a *ExportsAPI) create(w http.ResponseWriter, r *http.Request) { } } if len(ids) > 0 { - // FORCE set creator_in if URL params are present, even if p.Filters had something else (which is unlikely if mergePermission worked, but let's be safe) - // Actually, we should probably append or merge? For now, let's assume URL overrides or merges if key missing. - // Logic before was: if _, exists := p.Filters["creator_in"]; !exists { ... } - // But if user passed userId in URL, they probably want it to be used. - // If p.Filters["creator_in"] came from `Permission`, it might be the logged-in user. - // If the user is an admin acting as another user (passed in URL), we should probably use the URL one? - // But `mergePermissionIntoFilters` logic is strict. - // Let's keep existing logic: if permission set it, don't override. - // Wait, if permission is empty (e.g. admin), then `creator_in` is missing. - if _, exists := p.Filters["creator_in"]; !exists { - p.Filters["creator_in"] = ids - } else { - // If it exists, should we merge? - // If the existing one is from permission, it's a boundary. - // If we are admin, permission might be empty. - // Let's trust `mergePermissionIntoFilters`. + // 如果传递了 plan_id_eq 或 reseller_id_eq,不设置 creator_in + skipCreator := false + if ds == "marketing" && (main == "order" || main == "order_info") { + if v, ok := p.Filters["plan_id_eq"]; ok && v != nil && v != "" && v != 0 { + skipCreator = true + } + if v, ok := p.Filters["reseller_id_eq"]; ok && v != nil && v != "" && v != 0 { + skipCreator = true + } + } + if !skipCreator { + if _, exists := p.Filters["creator_in"]; !exists { + p.Filters["creator_in"] = ids + } } } } @@ -1555,10 +1553,6 @@ func mergePermissionIntoFilters(ds, main string, perm map[string]interface{}, fi if filters == nil { filters = map[string]interface{}{} } - // if creator_in already present, keep it - if hasNonEmptyIDs(filters["creator_in"]) { - return filters - } // 先处理 plan_id_eq 和 reseller_id_eq 的设置 if v, ok := pickFirst(perm, filters, []string{"reseller_id", "merchant_id"}); ok { filters["reseller_id_eq"] = v @@ -1566,15 +1560,26 @@ func mergePermissionIntoFilters(ds, main string, perm map[string]interface{}, fi if v, ok := pickFirst(perm, filters, []string{"plan_id", "activity_id"}); ok { filters["plan_id_eq"] = v } - // 如果传递了 plan_id_eq 或 reseller_id_eq 且不为空,则不再过滤 creator + // 如果传递了 plan_id_eq 或 reseller_id_eq 且不为空,则删除已有的 creator_in 并跳过设置 if ds == "marketing" && (main == "order" || main == "order_info") { + hasPlanOrReseller := false if v, ok := filters["plan_id_eq"]; ok && v != nil && v != "" && v != 0 { - goto skipCreator + hasPlanOrReseller = true } if v, ok := filters["reseller_id_eq"]; ok && v != nil && v != "" && v != 0 { + hasPlanOrReseller = true + } + if hasPlanOrReseller { + // 删除已有的 creator_in + delete(filters, "creator_in") + delete(filters, "creator_ids") goto skipCreator } } + // if creator_in already present, keep it + if hasNonEmptyIDs(filters["creator_in"]) { + return filters + } // try known keys { candidates := []string{"creator_in", "creator_ids", "user_ids", "user_id_in", "user_id", "owner_id"}