2022-06-21 20:50:38 +08:00
|
|
|
|
package feishu
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
2022-07-01 12:35:02 +08:00
|
|
|
|
"fmt"
|
|
|
|
|
"strings"
|
2022-06-21 20:50:38 +08:00
|
|
|
|
|
|
|
|
|
"github.com/chyroc/lark"
|
2022-07-01 12:35:02 +08:00
|
|
|
|
"github.com/eryajf/go-ldap-admin/config"
|
2022-07-15 17:56:45 +08:00
|
|
|
|
"github.com/eryajf/go-ldap-admin/public/tools"
|
2022-06-21 20:50:38 +08:00
|
|
|
|
)
|
|
|
|
|
|
2022-06-22 10:27:52 +08:00
|
|
|
|
// 官方文档: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/contact-v3/department/children
|
2022-06-21 20:50:38 +08:00
|
|
|
|
// GetAllDepts 获取所有部门
|
2022-07-01 12:35:02 +08:00
|
|
|
|
func GetAllDepts() (ret []map[string]interface{}, err error) {
|
2022-06-21 20:50:38 +08:00
|
|
|
|
var (
|
2023-04-10 21:23:24 +08:00
|
|
|
|
fetchChild bool = true
|
|
|
|
|
pageSize int64 = 50
|
|
|
|
|
pageToken string = ""
|
|
|
|
|
// DeptID lark.DepartmentIDType = "department_id"
|
2022-06-21 20:50:38 +08:00
|
|
|
|
)
|
|
|
|
|
|
2023-04-10 21:23:24 +08:00
|
|
|
|
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
|
|
|
|
|
}
|
2022-06-21 20:50:38 +08:00
|
|
|
|
|
2023-04-10 21:23:24 +08:00
|
|
|
|
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
|
2022-06-21 20:50:38 +08:00
|
|
|
|
}
|
2023-04-10 21:23:24 +08:00
|
|
|
|
} 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
|
2022-07-01 12:35:02 +08:00
|
|
|
|
}
|
2023-04-10 21:23:24 +08:00
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-06-21 20:50:38 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-22 10:27:52 +08:00
|
|
|
|
// 官方文档: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/contact-v3/user/find_by_department
|
2022-06-21 20:50:38 +08:00
|
|
|
|
// GetAllUsers 获取所有员工信息
|
2022-07-01 12:35:02 +08:00
|
|
|
|
func GetAllUsers() (ret []map[string]interface{}, err error) {
|
2022-06-21 20:50:38 +08:00
|
|
|
|
var (
|
2023-04-10 21:23:24 +08:00
|
|
|
|
pageSize int64 = 50
|
|
|
|
|
pageToken string = ""
|
|
|
|
|
// deptidtype lark.DepartmentIDType = "department_id"
|
2022-06-21 20:50:38 +08:00
|
|
|
|
)
|
|
|
|
|
depts, err := GetAllDepts()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2022-07-19 11:47:37 +08:00
|
|
|
|
|
|
|
|
|
deptids := make([]string, 0)
|
2023-04-10 21:23:24 +08:00
|
|
|
|
// deptids = append(deptids, "0")
|
2022-06-21 20:50:38 +08:00
|
|
|
|
for _, dept := range depts {
|
2022-07-19 11:47:37 +08:00
|
|
|
|
deptids = append(deptids, dept["open_department_id"].(string))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, deptid := range deptids {
|
2022-06-21 20:50:38 +08:00
|
|
|
|
req := lark.GetUserListReq{
|
2023-04-10 21:23:24 +08:00
|
|
|
|
PageSize: &pageSize,
|
|
|
|
|
PageToken: &pageToken,
|
|
|
|
|
// DepartmentIDType: &deptidtype,
|
2022-07-19 11:47:37 +08:00
|
|
|
|
DepartmentID: deptid,
|
2022-06-21 20:50:38 +08:00
|
|
|
|
}
|
|
|
|
|
for {
|
|
|
|
|
res, _, err := InitFeiShuClient().Contact.GetUserList(context.Background(), &req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2022-07-01 12:35:02 +08:00
|
|
|
|
for _, user := range res.Items {
|
|
|
|
|
ele := make(map[string]interface{})
|
|
|
|
|
ele["name"] = user.Name
|
2022-07-15 17:56:45 +08:00
|
|
|
|
ele["custom_name_pinyin"] = tools.ConvertToPinYin(user.Name)
|
2022-07-01 12:35:02 +08:00
|
|
|
|
ele["union_id"] = user.UnionID
|
|
|
|
|
ele["user_id"] = user.UserID
|
|
|
|
|
ele["open_id"] = user.OpenID
|
|
|
|
|
ele["en_name"] = user.EnName
|
|
|
|
|
ele["nickname"] = user.Nickname
|
2022-07-04 17:35:20 +08:00
|
|
|
|
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]
|
|
|
|
|
}
|
2022-07-01 12:35:02 +08:00
|
|
|
|
ele["email"] = user.Email
|
2022-07-18 15:36:55 +08:00
|
|
|
|
ele["mobile"] = user.Mobile
|
2022-07-01 12:35:02 +08:00
|
|
|
|
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)
|
|
|
|
|
}
|
2022-06-21 20:50:38 +08:00
|
|
|
|
if !res.HasMore {
|
|
|
|
|
break
|
|
|
|
|
}
|
2023-04-10 21:23:24 +08:00
|
|
|
|
pageToken = res.PageToken
|
2022-06-21 20:50:38 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-22 10:27:52 +08:00
|
|
|
|
// 官方文档: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/ehr/ehr-v1/employee/list
|
2022-06-21 20:50:38 +08:00
|
|
|
|
// 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
|
|
|
|
|
}
|