调整钉钉同步的部门,除了定级部门为ou外,其他默认为cn 优化生成中文名的逻辑,防止重名用户出现Feature/ding talk sync (#15)

This commit is contained in:
xinyuandd 2022-06-03 21:34:25 +08:00 committed by GitHub
parent 6714a3fca9
commit 633d78c21b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 54 additions and 28 deletions

View File

@ -14,6 +14,7 @@ import (
"github.com/zhaoyunxing92/dingtalk/v2" "github.com/zhaoyunxing92/dingtalk/v2"
dingreq "github.com/zhaoyunxing92/dingtalk/v2/request" dingreq "github.com/zhaoyunxing92/dingtalk/v2/request"
"gorm.io/gorm" "gorm.io/gorm"
"regexp"
"strconv" "strconv"
"strings" "strings"
) )
@ -58,9 +59,9 @@ func (d *DingTalkLogic) GetSubDepts(client *dingtalk.DingTalk, req *dingreq.Dept
fmt.Println("GetSubDepts获取到的钉钉部门列表", depts) fmt.Println("GetSubDepts获取到的钉钉部门列表", depts)
// 遍历并处理当前部门信息 // 遍历并处理当前部门信息
for _, dept := range depts.Depts { for _, dept := range depts.Depts {
//先判断分组类型 //先判断分组类型,默认为cn方便应对钉钉动态调整原本没有成员的部门加入成员后导致我们无法增加
localDept := request.DingGroupAddReq{ localDept := request.DingGroupAddReq{
GroupType: "ou", GroupType: "cn",
ParentId: pgId, ParentId: pgId,
GroupName: dept.Name, GroupName: dept.Name,
Remark: dept.Name, Remark: dept.Name,
@ -70,17 +71,17 @@ func (d *DingTalkLogic) GetSubDepts(client *dingtalk.DingTalk, req *dingreq.Dept
SourceUserNum: 0, SourceUserNum: 0,
} }
//获取钉钉方若部门存在人员信息则设置为cn类型 //获取钉钉方若部门存在人员信息则设置为cn类型
reqTemp := &dingreq.DeptUserId{} //reqTemp := &dingreq.DeptUserId{}
reqTemp.DeptId = dept.Id //reqTemp.DeptId = dept.Id
repTemp, err := client.GetDeptUserIds(reqTemp) //repTemp, err := client.GetDeptUserIds(reqTemp)
if err != nil { //if err != nil {
return errors.New(fmt.Sprintf("GetSubDepts获取部门用户Id列表失败%s", err.Error())) // return errors.New(fmt.Sprintf("GetSubDepts获取部门用户Id列表失败%s", err.Error()))
} //}
fmt.Println("钉钉部门人员列表:", repTemp) //fmt.Println("钉钉部门人员列表:", repTemp)
if len(repTemp.UserIds) > 0 { //if len(repTemp.UserIds) > 0 {
localDept.GroupType = "cn" // localDept.GroupType = "cn"
localDept.SourceUserNum = len(repTemp.UserIds) // localDept.SourceUserNum = len(repTemp.UserIds)
} //}
// 处理部门入库 // 处理部门入库
deptTemp, err := d.AddDept(&localDept) deptTemp, err := d.AddDept(&localDept)
if err != nil { if err != nil {
@ -158,15 +159,19 @@ func (d DingTalkLogic) AddDeptUser(client *dingtalk.DingTalk, dept *model.Group,
// } // }
// 获取人员信息 // 获取人员信息
fmt.Println("钉钉人员详情:", detail) fmt.Println("钉钉人员详情:", detail)
userName := detail.Mobile userName := ""
if detail.Name != "" { if detail.OrgEmail != "" {
name := pinyin.LazyConvert(detail.Name, nil)
userName = strings.Join(name, "")
}
if userName == "" && detail.OrgEmail != "" {
emailstr := strings.Split(detail.OrgEmail, "@") emailstr := strings.Split(detail.OrgEmail, "@")
userName = emailstr[0] userName = emailstr[0]
} }
if userName == "" && detail.Name != "" {
name := pinyin.LazyConvert(detail.Name, nil)
userName = strings.Join(name, "")
}
if userName == "" && detail.Mobile != "" {
userName = detail.Mobile
}
if detail.JobNumber == "" { if detail.JobNumber == "" {
detail.JobNumber = userName detail.JobNumber = userName
} }
@ -335,6 +340,7 @@ func (d DingTalkLogic) AddUser(r *request.DingUserAddReq) (data *model.User, rsp
emptyData.GivenName = r.GivenName emptyData.GivenName = r.GivenName
return emptyData, nil return emptyData, nil
} }
isExist := false isExist := false
oldData := new(model.User) oldData := new(model.User)
if isql.User.Exist(tools.H{"source_user_id": r.SourceUserId}) { if isql.User.Exist(tools.H{"source_user_id": r.SourceUserId}) {
@ -371,15 +377,6 @@ func (d DingTalkLogic) AddUser(r *request.DingUserAddReq) (data *model.User, rsp
isExist = true isExist = true
} }
} }
if !isExist {
if isql.User.Exist(tools.H{"username": r.Username}) {
err := isql.User.Find(tools.H{"username": r.Username}, oldData)
if err != nil {
return nil, errors.New(fmt.Sprintf("AddUser根据钉钉用户username获取用户失败%s", err.Error()))
}
isExist = true
}
}
if !isExist { if !isExist {
if isql.User.Exist(tools.H{"mobile": r.Mobile}) { if isql.User.Exist(tools.H{"mobile": r.Mobile}) {
err := isql.User.Find(tools.H{"mobile": r.Mobile}, oldData) err := isql.User.Find(tools.H{"mobile": r.Mobile}, oldData)
@ -389,7 +386,31 @@ func (d DingTalkLogic) AddUser(r *request.DingUserAddReq) (data *model.User, rsp
isExist = true isExist = true
} }
} }
if !isExist {
//组装用户名
//先根据钉钉唯一id获取查看数据库中是否存在
//不存在,则根据用户名 like 用户名获取尾号最大的账号
//重新设定用户名
userData := new(model.User)
err := isql.User.FindTheSameUserName(r.Username, userData)
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
} else {
// 找到重名用户,
re := regexp.MustCompile("[0-9]+")
num := re.FindString(userData.Username)
n := 1
if num != "" {
m, err := strconv.Atoi(num)
if err != nil {
return
}
n = m + 1
}
r.Username = fmt.Sprintf("%s%d", r.Username, n)
}
}
if isExist { if isExist {
r.Username = oldData.Username
user, err := d.UpdateUser(r, oldData) user, err := d.UpdateUser(r, oldData)
if err != nil { if err != nil {
return nil, errors.New(fmt.Sprintf("AddUser用户已存在更新用户失败%s", err.Error())) return nil, errors.New(fmt.Sprintf("AddUser用户已存在更新用户失败%s", err.Error()))

View File

@ -120,6 +120,11 @@ func (s UserService) Exist(filter map[string]interface{}) bool {
return !errors.Is(err, gorm.ErrRecordNotFound) return !errors.Is(err, gorm.ErrRecordNotFound)
} }
// Find 获取同名用户已入库的序号最大的用户信息
func (s UserService) FindTheSameUserName(username string, data *model.User) error {
return common.DB.Where("username REGEXP ? ", fmt.Sprintf("^%s[0-9]{0,3}$", username)).Order("username desc").First(&data).Error
}
// Find 获取单个资源 // Find 获取单个资源
func (s UserService) Find(filter map[string]interface{}, data *model.User) error { func (s UserService) Find(filter map[string]interface{}, data *model.User) error {
return common.DB.Where(filter).Preload("Roles").First(&data).Error return common.DB.Where(filter).Preload("Roles").First(&data).Error