package comm import "strings" // ScopeToProduct 把「只看这个产品」这层过滤显式拼进查询条件。 // // device_mac 合表之后(2026-09-04 由 license_ 分表合并而来), // productid 不再由表名承担。原先每个函数都靠 license_ 这张表**隐含**了 // 产品作用域,合表后**每一处按产品语义的读写都必须显式带上 productid**—— // 漏一处就跨产品操作:查询多列出别的产品的设备还只是难看, // 批量禁用 / 按批次删除漏掉就是直接误伤别人的数据。 // // pid == 0 表示不限产品(后台「全部产品」视图),此时原样返回。 func ScopeToProduct(pid uint32, query string, args []interface{}) (string, []interface{}) { if pid == 0 { return query, args } scoped := make([]interface{}, 0, len(args)+1) scoped = append(scoped, pid) scoped = append(scoped, args...) if strings.TrimSpace(query) == "" { return "productid=?", scoped } // 原条件整体括起来:调用方传的可能是 "a=? or b=?",不括会让 or 把 productid 短路掉。 return "productid=? and (" + query + ")", scoped }