eryajf / go-ldap-admin

🌉 基于Go+Vue实现的openLDAP后台管理项目
http://ldapdoc.eryajf.net
Apache License 2.0
1.58k stars 265 forks source link

🐛 一些问题。。。 | [Bug] Some problem... #238

Closed Pepperpotato closed 1 year ago

Pepperpotato commented 1 year ago

您使用的版本? | Your usage version?

docker-compose在本地快速拉起的测试环境,并修改了config.yml中飞书的相关配置

您使用的场景? | Your usage scenarios?

在用户管理中,点击从飞书同步所有用户的信息

image

您做了什么操作? | What did you do?

首先按照文档,录入分组字段动态关联和用户字段动态关联。同时也获取了有权限的飞书AppID和AppSecret。 点击从飞书同步到用户信息

您遇到了什么问题? | What are your problems?

点击同步后只同步了一个部门的信息,其他部门的用户没有同步到。使用文档中提供的demo用例是没有这个问题的。

您期望的结果是怎样的? | What is your expected outcome?

希望同步到所有的部门的所有人

eryajf commented 1 year ago

您好 @Pepperpotato👋,我已收到您的反馈,我将安排时间考虑您提交的信息并进行回复。-- 这条信息是由自动回复的机器人发出的。

Hello @Pepperpotato. I have received your feedback, and I will arrange time to consider the information you submitted and reply. -- This message is sent by an automatic reply robot.

Pepperpotato commented 1 year ago

查看源码后不知道是不是这里的问题导致的: GetAllUsers方法中第206行 `

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,导致获取的人员为空
            break
        }
        pageToken = res.PageToken
    }
}‘
eryajf commented 1 year ago

有两种可能。

1.获取的数据有问题,可通过这个脚本进行验证: https://github.com/eryajf/third-tools/tree/main/feishu

  1. 有可能是写入时有问题,你可以再次点击同步,然后打开浏览器的检查,看看是否有接口的报错
Pepperpotato commented 1 year ago

关于第一点: 我本地就是用的这个脚本去验证的。没有问题,能获取到全量的用户数据

关于第二点:多次点击同步了,但还是只同步了一个部门。

我尝试修改源码之后问题解决了

image
eryajf commented 1 year ago

看起来是个bug,是否有兴趣提交一个PR

Pepperpotato commented 1 year ago

可以的 我稍后来提交下。