批量更新

This commit is contained in:
2025-11-06 16:40:53 +08:00
parent 6a9b5d413a
commit 873a2e297a
43 changed files with 229 additions and 3321 deletions
+28 -15
View File
@@ -50,33 +50,46 @@ func init() {
func GetRoleMenus(roleId int) ([]int, error) {
o := orm.NewOrm()
var menuIdsJson sql.NullString
var menuIdsStr string
// 方法1: 尝试使用 JSON_UNQUOTE 读取 JSON 字段
err := o.Raw("SELECT IFNULL(JSON_UNQUOTE(JSON_EXTRACT(menu_ids, '$')), '[]') FROM yz_roles WHERE role_id = ? AND delete_time IS NULL", roleId).QueryRow(&menuIdsJson)
// 如果方法1失败或结果为空,尝试方法2: 直接 CAST
if err != nil {
fmt.Printf("方法1失败,尝试方法2: %v\n", err)
err = nil // 重置错误,尝试方法2
}
if err != nil || !menuIdsJson.Valid || menuIdsJson.String == "" || menuIdsJson.String == "[]" {
fmt.Printf("方法1结果无效,尝试方法2\n")
err2 := o.Raw("SELECT CAST(IFNULL(menu_ids, '[]') AS CHAR) FROM yz_roles WHERE role_id = ? AND delete_time IS NULL", roleId).QueryRow(&menuIdsJson)
err := o.Raw("SELECT IFNULL(JSON_UNQUOTE(JSON_EXTRACT(menu_ids, '$')), '[]') FROM yz_roles WHERE role_id = ? AND delete_time IS NULL", roleId).QueryRow(&menuIdsStr)
if err == nil && menuIdsStr != "" && menuIdsStr != "[]" {
menuIdsJson = sql.NullString{String: menuIdsStr, Valid: true}
fmt.Printf("GetRoleMenus: 方法1成功,角色 %d 的 menu_ids: %s\n", roleId, menuIdsStr[:min(100, len(menuIdsStr))])
} else {
// 方法1失败,尝试方法2: 直接 CAST
if err != nil {
fmt.Printf("GetRoleMenus: 方法1失败 (%v),尝试方法2\n", err)
} else {
fmt.Printf("GetRoleMenus: 方法1结果为空,尝试方法2\n")
}
// 重置变量
menuIdsStr = ""
err2 := o.Raw("SELECT CAST(IFNULL(menu_ids, '[]') AS CHAR) FROM yz_roles WHERE role_id = ? AND delete_time IS NULL", roleId).QueryRow(&menuIdsStr)
if err2 != nil {
// 如果角色不存在,返回空数组而不是错误(兼容性处理)
if err2 == orm.ErrNoRows {
fmt.Printf("角色 %d 不存在\n", roleId)
fmt.Printf("GetRoleMenus: 角色 %d 不存在\n", roleId)
return []int{}, nil
}
fmt.Printf("读取角色 %d 的 menu_ids 失败: %v\n", roleId, err2)
return nil, fmt.Errorf("获取角色菜单失败: %v", err2)
fmt.Printf("GetRoleMenus: 方法2也失败,角色 %d 的 menu_ids 读取失败: %v\n", roleId, err2)
return []int{}, nil // 返回空数组而不是错误,保持兼容性
}
if menuIdsStr != "" && menuIdsStr != "[]" && menuIdsStr != "null" {
menuIdsJson = sql.NullString{String: menuIdsStr, Valid: true}
fmt.Printf("GetRoleMenus: 方法2成功,角色 %d 的 menu_ids: %s\n", roleId, menuIdsStr[:min(100, len(menuIdsStr))])
} else {
fmt.Printf("GetRoleMenus: 方法2结果也为空,角色 %d 的 menu_ids 为空或 null\n", roleId)
return []int{}, nil
}
}
// 如果 menuIdsJson 无效或为空,返回空数组
if !menuIdsJson.Valid || menuIdsJson.String == "" {
fmt.Printf("角色 %d 的 menu_ids 为空或无效\n", roleId)
fmt.Printf("GetRoleMenus: 角色 %d 的 menu_ids 最终为空或无效\n", roleId)
return []int{}, nil
}
+76 -12
View File
@@ -14,6 +14,7 @@ import (
type Role struct {
RoleId int `orm:"pk;auto;column(role_id)" json:"roleId"`
TenantId int `orm:"column(tenant_id)" json:"tenantId"`
Default int8 `orm:"column(default);default(2)" json:"default"` // 角色默认分配:1-只给租户1,2-所有租户可用,3-租户专属
RoleCode string `orm:"size(50);unique" json:"roleCode"`
RoleName string `orm:"size(100)" json:"roleName"`
Description string `orm:"type(text);null" json:"description"`
@@ -90,6 +91,7 @@ func GetRoleById(roleId int) (*Role, error) {
type roleResult struct {
RoleId int
TenantId int
Default int8
RoleCode string
RoleName string
Description string
@@ -105,8 +107,8 @@ func GetRoleById(roleId int) (*Role, error) {
var result roleResult
// 先读取其他字段(不包括 menu_ids),因为 Beego ORM 可能无法直接读取 JSON 类型
err := o.Raw("SELECT role_id, tenant_id, role_code, role_name, description, status, sort_order, create_time, update_time, delete_time, create_by, update_by FROM yz_roles WHERE role_id = ? AND delete_time IS NULL", roleId).QueryRow(
&result.RoleId, &result.TenantId, &result.RoleCode, &result.RoleName, &result.Description,
err := o.Raw("SELECT role_id, tenant_id, `default`, role_code, role_name, description, status, sort_order, create_time, update_time, delete_time, create_by, update_by FROM yz_roles WHERE role_id = ? AND delete_time IS NULL", roleId).QueryRow(
&result.RoleId, &result.TenantId, &result.Default, &result.RoleCode, &result.RoleName, &result.Description,
&result.Status, &result.SortOrder, &result.CreateTime, &result.UpdateTime,
&result.DeleteTime, &result.CreateBy, &result.UpdateBy,
)
@@ -150,6 +152,7 @@ func GetRoleById(roleId int) (*Role, error) {
role := &Role{
RoleId: result.RoleId,
TenantId: result.TenantId,
Default: result.Default,
RoleCode: result.RoleCode,
RoleName: result.RoleName,
Description: result.Description,
@@ -178,6 +181,7 @@ func GetAllRoles() ([]*Role, error) {
var results []struct {
RoleId int
TenantId int
Default int8
RoleCode string
RoleName string
Description string
@@ -191,7 +195,7 @@ func GetAllRoles() ([]*Role, error) {
UpdateBy string
}
_, err := o.Raw("SELECT role_id, tenant_id, role_code, role_name, description, CAST(IFNULL(menu_ids, '[]') AS CHAR) as menu_ids, status, sort_order, create_time, update_time, delete_time, create_by, update_by FROM yz_roles WHERE delete_time IS NULL ORDER BY sort_order ASC, role_id ASC").QueryRows(&results)
_, err := o.Raw("SELECT role_id, tenant_id, `default`, role_code, role_name, description, CAST(IFNULL(menu_ids, '[]') AS CHAR) as menu_ids, status, sort_order, create_time, update_time, delete_time, create_by, update_by FROM yz_roles WHERE delete_time IS NULL ORDER BY sort_order ASC, role_id ASC").QueryRows(&results)
if err != nil {
return nil, err
}
@@ -200,6 +204,7 @@ func GetAllRoles() ([]*Role, error) {
role := &Role{
RoleId: r.RoleId,
TenantId: r.TenantId,
Default: r.Default,
RoleCode: r.RoleCode,
RoleName: r.RoleName,
Description: r.Description,
@@ -228,6 +233,7 @@ func GetRoleByTenantId(tenantId int) ([]*Role, error) {
var results []struct {
RoleId int
TenantId int
Default int8
RoleCode string
RoleName string
Description string
@@ -241,7 +247,7 @@ func GetRoleByTenantId(tenantId int) ([]*Role, error) {
UpdateBy string
}
_, err := o.Raw("SELECT role_id, tenant_id, role_code, role_name, description, CAST(IFNULL(menu_ids, '[]') AS CHAR) as menu_ids, status, sort_order, create_time, update_time, delete_time, create_by, update_by FROM yz_roles WHERE (tenant_id = ? OR tenant_id = 0) AND delete_time IS NULL ORDER BY sort_order ASC, role_id ASC", tenantId).QueryRows(&results)
_, err := o.Raw("SELECT role_id, tenant_id, `default`, role_code, role_name, description, CAST(IFNULL(menu_ids, '[]') AS CHAR) as menu_ids, status, sort_order, create_time, update_time, delete_time, create_by, update_by FROM yz_roles WHERE (tenant_id = ? OR tenant_id = 0) AND delete_time IS NULL ORDER BY sort_order ASC, role_id ASC", tenantId).QueryRows(&results)
if err != nil {
return nil, err
}
@@ -250,6 +256,7 @@ func GetRoleByTenantId(tenantId int) ([]*Role, error) {
role := &Role{
RoleId: r.RoleId,
TenantId: r.TenantId,
Default: r.Default,
RoleCode: r.RoleCode,
RoleName: r.RoleName,
Description: r.Description,
@@ -272,9 +279,31 @@ func GetRoleByTenantId(tenantId int) ([]*Role, error) {
// GetRoleByCode 根据角色代码获取角色
func GetRoleByCode(roleCode string) (*Role, error) {
o := orm.NewOrm()
var role Role
err := o.QueryTable("yz_roles").Filter("role_code", roleCode).Filter("delete_time__isnull", true).One(&role)
// 使用Raw查询以正确读取所有字段,包括 default 和 menu_ids
type roleResult struct {
RoleId int
TenantId int
Default int8
RoleCode string
RoleName string
Description string
MenuIdsJson sql.NullString
Status int8
SortOrder int
CreateTime time.Time
UpdateTime time.Time
DeleteTime *time.Time
CreateBy string
UpdateBy string
}
var result roleResult
err := o.Raw("SELECT role_id, tenant_id, `default`, role_code, role_name, description, status, sort_order, create_time, update_time, delete_time, create_by, update_by FROM yz_roles WHERE role_code = ? AND delete_time IS NULL", roleCode).QueryRow(
&result.RoleId, &result.TenantId, &result.Default, &result.RoleCode, &result.RoleName, &result.Description,
&result.Status, &result.SortOrder, &result.CreateTime, &result.UpdateTime,
&result.DeleteTime, &result.CreateBy, &result.UpdateBy,
)
if err != nil {
return nil, err
}
@@ -283,11 +312,28 @@ func GetRoleByCode(roleCode string) (*Role, error) {
var menuIdsStr string
err2 := o.Raw("SELECT IFNULL(JSON_UNQUOTE(JSON_EXTRACT(menu_ids, '$')), '[]') FROM yz_roles WHERE role_code = ? AND delete_time IS NULL", roleCode).QueryRow(&menuIdsStr)
if err2 == nil && menuIdsStr != "" && menuIdsStr != "[]" {
role.MenuIdsJson = sql.NullString{String: menuIdsStr, Valid: true}
result.MenuIdsJson = sql.NullString{String: menuIdsStr, Valid: true}
}
role := &Role{
RoleId: result.RoleId,
TenantId: result.TenantId,
Default: result.Default,
RoleCode: result.RoleCode,
RoleName: result.RoleName,
Description: result.Description,
MenuIdsJson: result.MenuIdsJson,
Status: result.Status,
SortOrder: result.SortOrder,
CreateTime: result.CreateTime,
UpdateTime: result.UpdateTime,
DeleteTime: result.DeleteTime,
CreateBy: result.CreateBy,
UpdateBy: result.UpdateBy,
}
role.AfterRead()
return &role, nil
return role, nil
}
// CreateRole 创建角色
@@ -296,8 +342,17 @@ func CreateRole(role *Role) error {
role.BeforeInsert()
// 使用Raw插入以正确处理JSON字段,并获取插入后的ID
res, err := o.Raw("INSERT INTO yz_roles (tenant_id, role_code, role_name, description, menu_ids, status, sort_order, create_time, update_time, create_by, update_by) VALUES (?, ?, ?, ?, CAST(? AS JSON), ?, ?, NOW(), NOW(), ?, ?)",
role.TenantId, role.RoleCode, role.RoleName, role.Description, role.MenuIdsJson.String, role.Status, role.SortOrder, role.CreateBy, role.UpdateBy).Exec()
// 如果没有设置 default 值,根据 tenant_id 自动设置:tenant_id=0 时 default=2,否则 default=3
defaultValue := role.Default
if defaultValue == 0 {
if role.TenantId == 0 {
defaultValue = 2 // 所有租户可用
} else {
defaultValue = 3 // 租户专属
}
}
res, err := o.Raw("INSERT INTO yz_roles (tenant_id, `default`, role_code, role_name, description, menu_ids, status, sort_order, create_time, update_time, create_by, update_by) VALUES (?, ?, ?, ?, ?, CAST(? AS JSON), ?, ?, NOW(), NOW(), ?, ?)",
role.TenantId, defaultValue, role.RoleCode, role.RoleName, role.Description, role.MenuIdsJson.String, role.Status, role.SortOrder, role.CreateBy, role.UpdateBy).Exec()
if err != nil {
return err
}
@@ -324,8 +379,17 @@ func UpdateRole(role *Role) error {
role.BeforeUpdate()
// 使用Raw更新以正确处理JSON字段
_, err := o.Raw("UPDATE yz_roles SET tenant_id = ?, role_code = ?, role_name = ?, description = ?, menu_ids = CAST(? AS JSON), status = ?, sort_order = ?, update_time = NOW(), update_by = ? WHERE role_id = ? AND delete_time IS NULL",
role.TenantId, role.RoleCode, role.RoleName, role.Description, role.MenuIdsJson.String, role.Status, role.SortOrder, role.UpdateBy, role.RoleId).Exec()
// 如果没有设置 default 值,根据 tenant_id 自动设置:tenant_id=0 时 default=2,否则 default=3
defaultValue := role.Default
if defaultValue == 0 {
if role.TenantId == 0 {
defaultValue = 2 // 所有租户可用
} else {
defaultValue = 3 // 租户专属
}
}
_, err := o.Raw("UPDATE yz_roles SET tenant_id = ?, `default` = ?, role_code = ?, role_name = ?, description = ?, menu_ids = CAST(? AS JSON), status = ?, sort_order = ?, update_time = NOW(), update_by = ? WHERE role_id = ? AND delete_time IS NULL",
role.TenantId, defaultValue, role.RoleCode, role.RoleName, role.Description, role.MenuIdsJson.String, role.Status, role.SortOrder, role.UpdateBy, role.RoleId).Exec()
return err
}