mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-08-26 16:46:14 +08:00
94 lines
2.3 KiB
Go
94 lines
2.3 KiB
Go
// Package hgorm
|
|
// @Link https://github.com/bufanyun/hotgo
|
|
// @Copyright Copyright (c) 2023 HotGo CLI
|
|
// @Author Ms <133814250@qq.com>
|
|
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
|
|
package hgorm
|
|
|
|
import (
|
|
"context"
|
|
"hotgo/internal/consts"
|
|
"hotgo/utility/tree"
|
|
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
)
|
|
|
|
// TenantRelation 租户关系
|
|
type TenantRelation struct {
|
|
DeptType string // 部门类型
|
|
TenantId int64 // 租户ID
|
|
MerchantId int64 // 商户ID
|
|
UserId int64 // 用户ID
|
|
}
|
|
|
|
// GetTenantRelation 获取租户关系
|
|
func GetTenantRelation(ctx context.Context, memberId int64) (tr *TenantRelation, err error) {
|
|
data, err := g.Model("hg_admin_member u").Ctx(ctx).
|
|
LeftJoin("hg_admin_dept d", "u.dept_id=d.id").
|
|
Fields("u.tree,d.type").
|
|
Where("u.id", memberId).One()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if data.IsEmpty() {
|
|
err = gerror.Newf("未找到用户[%v]的租户关系,该用户不存在", memberId)
|
|
return
|
|
}
|
|
|
|
ids := tree.GetIds(data["tree"].String())
|
|
|
|
getRelationId := func(deptType string) (int64, error) {
|
|
id, err := g.Model("hg_admin_member u").Ctx(ctx).
|
|
LeftJoin("hg_admin_dept d", "u.dept_id=d.id").
|
|
Fields("u.id").
|
|
WhereIn("u.id", ids).Where("d.type", deptType).
|
|
OrderAsc("u.level"). // 确保是第一关系
|
|
Limit(1).
|
|
Value()
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
if id.Int64() < 1 {
|
|
err = gerror.Newf("未找到有效的租户关系,memberId:%v,deptType:%v", memberId, deptType)
|
|
return 0, err
|
|
}
|
|
return id.Int64(), nil
|
|
}
|
|
|
|
tr = new(TenantRelation)
|
|
tr.DeptType = data["type"].String()
|
|
switch tr.DeptType {
|
|
// 公司
|
|
case consts.DeptTypeCompany:
|
|
return
|
|
// 租户
|
|
case consts.DeptTypeTenant:
|
|
tr.TenantId = memberId
|
|
|
|
// 商户
|
|
case consts.DeptTypeMerchant:
|
|
tr.TenantId, err = getRelationId(consts.DeptTypeTenant)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
tr.MerchantId = memberId
|
|
// 用户
|
|
case consts.DeptTypeUser:
|
|
tr.TenantId, err = getRelationId(consts.DeptTypeTenant)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
tr.MerchantId, err = getRelationId(consts.DeptTypeMerchant)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
tr.UserId = memberId
|
|
default:
|
|
err = gerror.Newf("未找到用户[%v]的租户关系,部门类型[%v] 无效", memberId, tr.DeptType)
|
|
return nil, err
|
|
}
|
|
return
|
|
}
|