package controllers import ( "fmt" "strings" "server/models" "server/pkg/jwtutil" ) // CRM 客户 / 供应商的删除权限规则: // 1. 平台管理员(UserType=platform)可删除; // 2. 租户管理员(绑定「租户管理员」角色,或未分配角色/角色未配置权限等既有"全权限"情形)可删除; // 3. 记录的创建人可删除自己创建的记录。 // 其余用户一律禁止删除。删除本身为软删除(置 delete_time)。 // canDeleteCrmRecord 判断当前用户是否有权删除指定记录。 // createUserID 为记录的创建人用户ID(历史数据可能为空)。 func canDeleteCrmRecord(claims *jwtutil.Claims, createUserID string) bool { if claims == nil { return false } // 平台管理员 if claims.UserType == "platform" { return true } // 创建人本人 uid := fmt.Sprintf("%d", claims.UserID) if createUserID != "" && createUserID == uid { return true } // 租户管理员 / 具备全权限的租户用户 return isTenantAdmin(claims.UserID, claims.TenantId) } // isTenantAdmin 判断用户在指定租户内是否具备管理员(全权限)身份。 // 判定与既有权限约定保持一致: // - 未分配角色(group_id=0)视为全权限; // - 角色名为「租户管理员」视为管理员; // - 角色未配置 rights(空/空数组/null)视为全权限。 func isTenantAdmin(userID int, tenantID int) bool { if tenantID <= 0 || models.Orm == nil { return false } var tu models.SystemTenantUser if err := models.Orm.QueryTable(new(models.SystemTenantUser)). Filter("uid", userID). Filter("tid", tenantID). Filter("delete_time__isnull", true). One(&tu); err != nil { return false } if tu.GroupID == 0 { return true } var role models.AdminRole if err := models.Orm.QueryTable(new(models.AdminRole)). Filter("id", tu.GroupID). Filter("cid", 2). Filter("tenant_id", tenantID). One(&role); err != nil { return false } if role.Name == "租户管理员" { return true } rights := "" if role.Rights != nil { rights = strings.TrimSpace(*role.Rights) } return rights == "" || rights == "[]" || rights == "null" }