231 lines
6.5 KiB
Go
231 lines
6.5 KiB
Go
package feishu
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"strings"
|
||
|
||
"github.com/chyroc/lark"
|
||
"github.com/eryajf/go-ldap-admin/config"
|
||
"github.com/eryajf/go-ldap-admin/public/tools"
|
||
)
|
||
|
||
// 官方文档: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/contact-v3/department/children
|
||
// GetAllDepts 获取所有部门
|
||
func GetAllDepts() (ret []map[string]interface{}, err error) {
|
||
var (
|
||
fetchChild bool = true
|
||
pageSize int64 = 50
|
||
pageToken string = ""
|
||
// DeptID lark.DepartmentIDType = "department_id"
|
||
)
|
||
|
||
if len(config.Conf.FeiShu.DeptList) == 0 {
|
||
req := lark.GetDepartmentListReq{
|
||
// DepartmentIDType: &DeptID,
|
||
PageToken: &pageToken,
|
||
FetchChild: &fetchChild,
|
||
PageSize: &pageSize,
|
||
DepartmentID: "0",
|
||
}
|
||
for {
|
||
res, _, err := InitFeiShuClient().Contact.GetDepartmentList(context.TODO(), &req)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
for _, dept := range res.Items {
|
||
ele := make(map[string]interface{})
|
||
ele["name"] = dept.Name
|
||
ele["custom_name_pinyin"] = tools.ConvertToPinYin(dept.Name)
|
||
ele["parent_department_id"] = dept.ParentDepartmentID
|
||
ele["department_id"] = dept.DepartmentID
|
||
ele["open_department_id"] = dept.OpenDepartmentID
|
||
ele["leader_user_id"] = dept.LeaderUserID
|
||
ele["unit_ids"] = dept.UnitIDs
|
||
ret = append(ret, ele)
|
||
}
|
||
if !res.HasMore {
|
||
break
|
||
}
|
||
pageToken = res.PageToken
|
||
}
|
||
} else {
|
||
//使用dept-list来一个一个添加部门,开头为^的不添加子部门
|
||
isInDeptList := func(id string) bool {
|
||
for _, v := range config.Conf.FeiShu.DeptList {
|
||
if strings.HasPrefix(v, "^") {
|
||
v = v[1:]
|
||
}
|
||
if id == v {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|
||
dep_append_norepeat := func(ret []map[string]interface{}, dept map[string]interface{}) []map[string]interface{} {
|
||
for _, v := range ret {
|
||
if v["open_department_id"] == dept["open_department_id"] {
|
||
return ret
|
||
}
|
||
}
|
||
return append(ret, dept)
|
||
}
|
||
for _, dep_s := range config.Conf.FeiShu.DeptList {
|
||
dept_id := dep_s
|
||
no_add_children := false
|
||
if strings.HasPrefix(dep_s, "^") {
|
||
no_add_children = true
|
||
dept_id = dep_s[1:]
|
||
}
|
||
req := lark.GetDepartmentReq{
|
||
DepartmentID: dept_id,
|
||
}
|
||
res, _, err := InitFeiShuClient().Contact.GetDepartment(context.TODO(), &req)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
ele := make(map[string]interface{})
|
||
|
||
ele["name"] = res.Department.Name
|
||
ele["custom_name_pinyin"] = tools.ConvertToPinYin(res.Department.Name)
|
||
if isInDeptList(res.Department.ParentDepartmentID) {
|
||
ele["parent_department_id"] = res.Department.ParentDepartmentID
|
||
} else {
|
||
ele["parent_department_id"] = "0"
|
||
}
|
||
ele["department_id"] = res.Department.DepartmentID
|
||
ele["open_department_id"] = res.Department.OpenDepartmentID
|
||
ele["leader_user_id"] = res.Department.LeaderUserID
|
||
ele["unit_ids"] = res.Department.UnitIDs
|
||
ret = dep_append_norepeat(ret, ele)
|
||
|
||
if !no_add_children {
|
||
pageToken = ""
|
||
req := lark.GetDepartmentListReq{
|
||
// DepartmentIDType: &DeptID,
|
||
PageToken: &pageToken,
|
||
FetchChild: &fetchChild,
|
||
PageSize: &pageSize,
|
||
DepartmentID: dept_id,
|
||
}
|
||
for {
|
||
res, _, err := InitFeiShuClient().Contact.GetDepartmentList(context.TODO(), &req)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
for _, dept := range res.Items {
|
||
ele := make(map[string]interface{})
|
||
ele["name"] = dept.Name
|
||
ele["custom_name_pinyin"] = tools.ConvertToPinYin(dept.Name)
|
||
ele["parent_department_id"] = dept.ParentDepartmentID
|
||
ele["department_id"] = dept.DepartmentID
|
||
ele["open_department_id"] = dept.OpenDepartmentID
|
||
ele["leader_user_id"] = dept.LeaderUserID
|
||
ele["unit_ids"] = dept.UnitIDs
|
||
ret = dep_append_norepeat(ret, ele)
|
||
}
|
||
if !res.HasMore {
|
||
break
|
||
}
|
||
pageToken = res.PageToken
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
// 官方文档: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/contact-v3/user/find_by_department
|
||
// GetAllUsers 获取所有员工信息
|
||
func GetAllUsers() (ret []map[string]interface{}, err error) {
|
||
var (
|
||
pageSize int64 = 50
|
||
pageToken string = ""
|
||
// deptidtype lark.DepartmentIDType = "department_id"
|
||
)
|
||
depts, err := GetAllDepts()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
deptids := make([]string, 0)
|
||
// deptids = append(deptids, "0")
|
||
for _, dept := range depts {
|
||
deptids = append(deptids, dept["open_department_id"].(string))
|
||
}
|
||
|
||
for _, deptid := range deptids {
|
||
req := lark.GetUserListReq{
|
||
PageSize: &pageSize,
|
||
PageToken: &pageToken,
|
||
// DepartmentIDType: &deptidtype,
|
||
DepartmentID: deptid,
|
||
}
|
||
for {
|
||
res, _, err := InitFeiShuClient().Contact.GetUserList(context.Background(), &req)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
for _, user := range res.Items {
|
||
ele := make(map[string]interface{})
|
||
ele["name"] = user.Name
|
||
ele["custom_name_pinyin"] = tools.ConvertToPinYin(user.Name)
|
||
ele["union_id"] = user.UnionID
|
||
ele["user_id"] = user.UserID
|
||
ele["open_id"] = user.OpenID
|
||
ele["en_name"] = user.EnName
|
||
ele["nickname"] = user.Nickname
|
||
if user.Email != "" {
|
||
ele["custom_nickname_email"] = strings.Split(user.Email, "@")[0]
|
||
}
|
||
if user.EnterpriseEmail != "" {
|
||
ele["custom_nickname_enterprise_email"] = strings.Split(user.EnterpriseEmail, "@")[0]
|
||
}
|
||
ele["email"] = user.Email
|
||
ele["mobile"] = user.Mobile
|
||
ele["gender"] = user.Gender
|
||
ele["avatar"] = user.Avatar.AvatarOrigin
|
||
ele["city"] = user.City
|
||
ele["country"] = user.Country
|
||
ele["work_station"] = user.WorkStation
|
||
ele["join_time"] = user.JoinTime
|
||
ele["employee_no"] = user.EmployeeNo
|
||
ele["enterprise_email"] = user.EnterpriseEmail
|
||
ele["job_title"] = user.JobTitle
|
||
// 部门ids
|
||
var sourceDeptIds []string
|
||
for _, deptId := range user.DepartmentIDs {
|
||
sourceDeptIds = append(sourceDeptIds, fmt.Sprintf("%s_%s", config.Conf.FeiShu.Flag, deptId))
|
||
}
|
||
ele["department_ids"] = sourceDeptIds
|
||
ret = append(ret, ele)
|
||
}
|
||
if !res.HasMore {
|
||
pageToken = ""
|
||
break
|
||
}
|
||
pageToken = res.PageToken
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
// 官方文档: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/ehr/ehr-v1/employee/list
|
||
// GetLeaveUserIds 获取离职人员ID列表
|
||
func GetLeaveUserIds() ([]string, error) {
|
||
var ids []string
|
||
users, _, err := InitFeiShuClient().EHR.GetEHREmployeeList(context.TODO(), &lark.GetEHREmployeeListReq{
|
||
Status: []int64{5},
|
||
UserIDType: lark.IDTypePtr(lark.IDTypeUnionID), // 只查询unionID
|
||
})
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
for _, user := range users.Items {
|
||
ids = append(ids, user.UserID)
|
||
}
|
||
return ids, nil
|
||
}
|