1
This commit is contained in:
303
internal/app/system/logic/tenant/tenant.go
Normal file
303
internal/app/system/logic/tenant/tenant.go
Normal file
@@ -0,0 +1,303 @@
|
||||
/*
|
||||
* @desc:用户处理
|
||||
* @company:云南奇讯科技有限公司
|
||||
* @Author: yixiaohu<yxh669@qq.com>
|
||||
* @Date: 2022/9/23 15:08
|
||||
*/
|
||||
|
||||
package tenant
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"gitea.com/red-future/common/beans"
|
||||
"gitea.com/red-future/common/minio"
|
||||
"gitea.com/red-future/common/utils"
|
||||
"github.com/gogf/gf/v2/container/gset"
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
"github.com/gogf/gf/v2/util/grand"
|
||||
"github.com/tiger1103/gfast/v3/api/v1/system"
|
||||
commonService "github.com/tiger1103/gfast/v3/internal/app/common/service"
|
||||
"github.com/tiger1103/gfast/v3/internal/app/system/consts"
|
||||
"github.com/tiger1103/gfast/v3/internal/app/system/dao"
|
||||
"github.com/tiger1103/gfast/v3/internal/app/system/model/do"
|
||||
"github.com/tiger1103/gfast/v3/internal/app/system/model/entity"
|
||||
"github.com/tiger1103/gfast/v3/internal/app/system/service"
|
||||
"github.com/tiger1103/gfast/v3/library/libUtils"
|
||||
"github.com/tiger1103/gfast/v3/library/liberr"
|
||||
)
|
||||
|
||||
func init() {
|
||||
service.RegisterTenant(New())
|
||||
}
|
||||
|
||||
type sTenant struct {
|
||||
}
|
||||
|
||||
func New() *sTenant {
|
||||
return &sTenant{}
|
||||
}
|
||||
|
||||
func (s *sTenant) GetTenantListSearch(ctx context.Context, req *system.TenantListReq) (res *system.TenantListRes, err error) {
|
||||
res = new(system.TenantListRes)
|
||||
err = g.Try(ctx, func(ctx context.Context) {
|
||||
res.ImgAddressPrefix = minio.GetFileAddressPrefix(ctx)
|
||||
model := dao.TenantDao.Ctx(ctx)
|
||||
// 根据toke获取用户id
|
||||
userId := service.Context().GetUserId(ctx)
|
||||
getUserById, err := service.SysUser().GetUserById(ctx, userId)
|
||||
liberr.ErrIsNil(ctx, err, "获取用户信息失败")
|
||||
roleIds, err := service.SysUser().GetAdminRoleIds(ctx, userId)
|
||||
// 根据用户角色查询对应数据(9代理,10普通)
|
||||
for _, v := range roleIds {
|
||||
if v == consts.SalesAgentId || v == consts.SiteAdminId {
|
||||
model = model.Where(dao.TenantDao.Columns().TenantSource, gconv.Int64(getUserById.TenantId))
|
||||
}
|
||||
}
|
||||
if !g.IsEmpty(req.TenantName) {
|
||||
model = model.Where(dao.TenantDao.Columns().TenantName+" like ? ", "%"+req.TenantName+"%")
|
||||
}
|
||||
if !g.IsEmpty(req.TenantType) {
|
||||
model = model.Where(dao.TenantDao.Columns().TenantType, gconv.Int(req.TenantType))
|
||||
}
|
||||
if !g.IsEmpty(req.CityCode) {
|
||||
model = model.Where(dao.TenantDao.Columns().CityCode, gconv.String(req.CityCode))
|
||||
}
|
||||
res.Total, err = model.Count()
|
||||
liberr.ErrIsNil(ctx, err, "获取租户数据失败")
|
||||
if req.PageNum == 0 {
|
||||
req.PageNum = 1
|
||||
}
|
||||
res.CurrentPage = req.PageNum
|
||||
if req.PageSize == 0 {
|
||||
req.PageSize = consts.PageSize
|
||||
}
|
||||
err = model.Page(res.CurrentPage, req.PageSize).Order(dao.TenantDao.Columns().CreatedAt + " desc").Scan(&res.List)
|
||||
liberr.ErrIsNil(ctx, err, "获取数据失败")
|
||||
var list []map[string]interface{}
|
||||
err = utils.Struct(res.List, &list)
|
||||
liberr.ErrIsNil(ctx, err, "转换数据失败")
|
||||
// 2. 提取id
|
||||
userIds := make([]int, 0, len(list))
|
||||
cityIds := make([]string, 0, len(list))
|
||||
for _, obj := range list {
|
||||
// 提取id并转换(JSON数字是float64)
|
||||
idFloat, ok := obj["adminBy"].(float64)
|
||||
if !ok {
|
||||
fmt.Println("警告:adminBy字段非数字")
|
||||
continue
|
||||
}
|
||||
cityFloat, ok := obj["cityCode"].(string)
|
||||
if !ok {
|
||||
fmt.Println("警告:cityCode字段非字符串")
|
||||
continue
|
||||
}
|
||||
userIds = append(userIds, int(idFloat))
|
||||
cityIds = append(cityIds, cityFloat)
|
||||
}
|
||||
|
||||
userList, err := service.SysUser().GetUsers(ctx, userIds)
|
||||
liberr.ErrIsNil(ctx, err, "获取租户信息失败")
|
||||
areaDicList, err := service.AreaDict().GetAreaDict(ctx)
|
||||
liberr.ErrIsNil(ctx, err, "获取地区字典失败")
|
||||
for _, list := range res.List {
|
||||
for _, areas := range areaDicList {
|
||||
if fmt.Sprintf("%d", areas.Id) == list.CityCode {
|
||||
list.CityName = areas.CityName
|
||||
list.CityMergerName = areas.MergerName
|
||||
}
|
||||
}
|
||||
for _, users := range userList {
|
||||
if users.Id == list.AdminBy {
|
||||
list.UserName = users.UserName
|
||||
list.Mobile = users.Mobile
|
||||
list.UserNickname = users.UserNickname
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
func (s *sTenant) Add(ctx context.Context, req *system.TenantAddReq) (err error) {
|
||||
err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
|
||||
err = g.Try(ctx, func(ctx context.Context) {
|
||||
// 根据token获取用户id
|
||||
userId := service.Context().GetUserId(ctx)
|
||||
var getUserInfo *beans.User
|
||||
getUserInfo, err = utils.GetUserInfo(ctx)
|
||||
var userTenantId uint64
|
||||
if err == nil && !g.IsEmpty(getUserInfo.TenantId) {
|
||||
userTenantId = gconv.Uint64(getUserInfo.TenantId)
|
||||
}
|
||||
if !g.IsEmpty(userId) {
|
||||
var roleIds []uint
|
||||
roleIds, err = service.SysUser().GetAdminRoleIds(ctx, userId)
|
||||
liberr.ErrIsNil(ctx, err, "获取用户角色失败")
|
||||
// 如果是代理和普通用户只能添加普通类型(1普通类型,2代理类型)
|
||||
for _, v := range roleIds {
|
||||
if v == consts.SalesAgentId || v == consts.SiteAdminId {
|
||||
req.TenantType = consts.TenantTypeSite
|
||||
if v == consts.SalesAgentId {
|
||||
// 验证代理区域是否在当前代理的管辖范围内
|
||||
tenantEntity := new(entity.Tenant)
|
||||
err = dao.TenantDao.Ctx(ctx).TX(tx).Where(dao.TenantDao.Columns().Id, userTenantId).Scan(tenantEntity)
|
||||
liberr.ErrIsNil(ctx, err, "获取租户数据失败")
|
||||
var count int
|
||||
count, err = dao.AreaDictDao.Ctx(ctx).TX(tx).Where("("+dao.AreaDictDao.Columns().Id+"=? OR "+dao.AreaDictDao.Columns().ParentId+"=?) AND "+dao.AreaDictDao.Columns().Id+"=?", tenantEntity.CityCode, tenantEntity.CityCode, req.CityCode).Count()
|
||||
liberr.ErrIsNil(ctx, err, "验证代理区域失败")
|
||||
if count == 0 {
|
||||
liberr.ErrIsNil(ctx, errors.New("所选城市不在当前代理的管辖范围内"))
|
||||
}
|
||||
} else {
|
||||
if req.TenantType == consts.TenantTypeAgent {
|
||||
liberr.ErrIsNil(ctx, errors.New("代理商不能添加代理商"))
|
||||
}
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 如果是普通用户只能添加普通类型(1普通类型,2代理类型)
|
||||
req.TenantType = consts.TenantTypeSite
|
||||
}
|
||||
if req.TenantType == consts.TenantTypeAgent {
|
||||
// 验证代理区域是否已有代理商
|
||||
var count int
|
||||
count, err = dao.TenantDao.Ctx(ctx).TX(tx).Where(dao.TenantDao.Columns().CityCode, req.CityCode).Count()
|
||||
liberr.ErrIsNil(ctx, err, "获取租户数据失败")
|
||||
if count > 0 {
|
||||
liberr.ErrIsNil(ctx, errors.New("该城市已有代理商"))
|
||||
}
|
||||
}
|
||||
var tenantId int64
|
||||
tenantId, err = dao.TenantDao.Ctx(ctx).TX(tx).InsertAndGetId(do.Tenant{
|
||||
CreateBy: userId,
|
||||
UpdateBy: userId,
|
||||
TenantName: req.TenantName,
|
||||
TenantType: req.TenantType,
|
||||
CityCode: req.CityCode,
|
||||
BusinessLicense: req.BusinessLicense,
|
||||
TenantSource: userTenantId,
|
||||
})
|
||||
liberr.ErrIsNil(ctx, err, "添加租户失败")
|
||||
var RoleIds = []int64{consts.SiteAdminId}
|
||||
if !g.IsNil(req.TenantType) && req.TenantType == consts.TenantTypeAgent {
|
||||
RoleIds = []int64{consts.SalesAgentId}
|
||||
}
|
||||
|
||||
// 在同一事务中添加部门
|
||||
var deptId int64
|
||||
var deptInsertId sql.Result
|
||||
deptInsertId, err = dao.SysDept.Ctx(ctx).TX(tx).Insert(do.SysDept{
|
||||
ParentId: 0,
|
||||
DeptName: req.TenantName,
|
||||
OrderNum: 0,
|
||||
Leader: req.UserNickname,
|
||||
Phone: req.Mobile,
|
||||
Email: req.Mobile + "@qq.com",
|
||||
Status: 1,
|
||||
CreatedBy: userId,
|
||||
TenantId: uint64(tenantId),
|
||||
})
|
||||
liberr.ErrIsNil(ctx, err, "添加部门失败")
|
||||
deptId, err = deptInsertId.LastInsertId()
|
||||
liberr.ErrIsNil(ctx, err, "获取部门ID失败")
|
||||
|
||||
// 在同一事务中添加用户
|
||||
err = service.SysUser().UserNameOrMobileExists(ctx, req.UserName, req.Mobile)
|
||||
liberr.ErrIsNil(ctx, err)
|
||||
userSalt := grand.S(10)
|
||||
userPassword := libUtils.EncryptPassword(req.UserPassword, userSalt)
|
||||
var adminUserId int64
|
||||
adminUserId, err = dao.SysUser.Ctx(ctx).TX(tx).InsertAndGetId(do.SysUser{
|
||||
UserName: req.UserName,
|
||||
Mobile: req.Mobile,
|
||||
UserNickname: req.UserNickname,
|
||||
UserPassword: userPassword,
|
||||
UserSalt: userSalt,
|
||||
UserStatus: 1,
|
||||
DeptId: uint64(deptId),
|
||||
IsAdmin: 1,
|
||||
TenantId: uint64(tenantId),
|
||||
})
|
||||
liberr.ErrIsNil(ctx, err, "添加用户失败")
|
||||
// 添加用户角色信息(使用Casbin)
|
||||
enforcer, e := commonService.CasbinEnforcer(ctx)
|
||||
liberr.ErrIsNil(ctx, e, "获取权限引擎失败")
|
||||
for _, v := range RoleIds {
|
||||
_, e = enforcer.AddGroupingPolicy(fmt.Sprintf("u_%d", adminUserId), gconv.String(v))
|
||||
liberr.ErrIsNil(ctx, e, "设置用户权限失败")
|
||||
}
|
||||
// 更新租户的AdminBy字段
|
||||
_, err = dao.TenantDao.Ctx(ctx).TX(tx).WherePri(tenantId).Update(do.Tenant{
|
||||
AdminBy: adminUserId,
|
||||
})
|
||||
liberr.ErrIsNil(ctx, err, "修改租户信息失败")
|
||||
})
|
||||
return err
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
func (s *sTenant) Edit(ctx context.Context, req *system.TenantEditReq) (err error) {
|
||||
err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
|
||||
err = g.Try(ctx, func(ctx context.Context) {
|
||||
userId := service.Context().GetUserId(ctx)
|
||||
tenant := do.Tenant{
|
||||
UpdateBy: userId,
|
||||
TenantName: req.TenantName,
|
||||
CityCode: req.CityCode,
|
||||
BusinessLicense: req.BusinessLicense,
|
||||
}
|
||||
if !g.IsEmpty(req.TenantType) {
|
||||
tenant.TenantType = req.TenantType
|
||||
}
|
||||
_, err = dao.TenantDao.Ctx(ctx).TX(tx).WherePri(req.Id).Update(tenant)
|
||||
liberr.ErrIsNil(ctx, err, "修改租户信息失败")
|
||||
})
|
||||
return err
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
func (s *sTenant) GetTenantDetailsByIds(ctx context.Context, req *system.GetTenantDetailsByIdsReq) (res *system.GetTenantDetailsByIdsRes, err error) {
|
||||
res = new(system.GetTenantDetailsByIdsRes)
|
||||
if len(req.TenantIds) == 0 {
|
||||
return
|
||||
}
|
||||
idsSet := gset.NewIntSetFrom(gconv.Ints(req.TenantIds)).Slice()
|
||||
err = g.Try(ctx, func(ctx context.Context) {
|
||||
err = dao.TenantDao.Ctx(ctx).Where(dao.TenantDao.Columns().Id+" in(?)", idsSet).Order(dao.TenantDao.Columns().Id + " ASC").Scan(&res.List)
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
func (s *sTenant) GetTenantDetails(ctx context.Context, id uint64) (res *entity.Tenant, err error) {
|
||||
err = g.Try(ctx, func(ctx context.Context) {
|
||||
err = dao.TenantDao.Ctx(ctx).WherePri(id).Scan(&res)
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
func (s *sTenant) GetTenantAdminById(ctx context.Context, id uint64) (res []entity.Tenant, err error) {
|
||||
err = g.Try(ctx, func(ctx context.Context) {
|
||||
err = dao.TenantDao.Ctx(ctx).Where(dao.TenantDao.Columns().Id+" =(?) or "+dao.TenantDao.Columns().TenantSource+" =(?)", id, id).Order(dao.TenantDao.Columns().Id + " ASC").Scan(&res)
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
func (s *sTenant) GetTenantIdList(ctx context.Context, req *system.GetTenantListReq) (res []entity.Tenant, err error) {
|
||||
err = g.Try(ctx, func(ctx context.Context) {
|
||||
model := dao.TenantDao.Ctx(ctx)
|
||||
if !g.IsEmpty(req.TenantId) {
|
||||
model.Where(dao.TenantDao.Columns().Id, req.TenantId)
|
||||
}
|
||||
err = model.Scan(&res)
|
||||
})
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user