钉钉企业内部机器人开发——同步组织架构人员信息到数据库

这篇具有很好参考价值的文章主要介绍了钉钉企业内部机器人开发——同步组织架构人员信息到数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开发钉钉机器人的过程中,我们不仅需要直接把组织架构用户信息导入数据库,还要不定时的进行同步,因为钉钉里面的人员总是在变动,部门也是不断在调整。

下面是使用递归的方式,调用钉钉接口,同步部门和人员信息,没有的创建,多余的删除文章来源地址https://www.toymoban.com/news/detail-512353.html

func (d *DingDept) ImportDeptData() (DepartmentList []DingDept, err error) {
    var oldDept []DingDept
    err = global.GLOAB_DB.Find(&oldDept).Error
    if err != nil {

    }
    var dfs func(string, int) (err error)
    dfs = func(token string, id int) (err error) {
        var client *http.Client
        var request *http.Request
        var resp *http.Response
        var body []byte
        URL := "https://oapi.dingtalk.com/topapi/v2/department/listsub?access_token=" + token
        client = &http.Client{Transport: &http.Transport{ //对客户端进行一些配置
            TLSClientConfig: &tls.Config{
                InsecureSkipVerify: true,
            },
        }, Timeout: time.Duration(time.Second * 5)}
        //此处是post请求的请求题,我们先初始化一个对象
        b := struct {
            DeptID int `json:"dept_id"`
        }{
            DeptID: id,
        }
        //然后把结构体对象序列化一下
        bodymarshal, err := json.Marshal(&b)
        if err != nil {
            return
        }
        //再处理一下
        reqBody := strings.NewReader(string(bodymarshal))
        //然后就可以放入具体的request中的
        request, err = http.NewRequest(http.MethodPost, URL, reqBody)
        if err != nil {
            return
        }
        resp, err = client.Do(request)
        if err != nil {
            return
        }
        defer resp.Body.Close()
        body, err = ioutil.ReadAll(resp.Body) //把请求到的body转化成byte[]
        if err != nil {
            return
        }
        r := struct {
            DingResponseCommon
            Result []DingDept `json:"result"`
        }{}
        //把请求到的结构反序列化到专门接受返回值的对象上面
        err = json.Unmarshal(body, &r)
        if err != nil {
            return
        }
        if r.Errcode != 0 {
            return errors.New(r.Errmsg)
        }
        // 此处举行具体的逻辑判断,然后返回即可
        subDepartments := r.Result
        DepartmentList = append(DepartmentList, subDepartments...)
        if len(subDepartments) > 0 {
            for i := range subDepartments {
                departmentList := make([]DingDept, 0)
                dfs(token, subDepartments[i].DeptId)
                if err != nil {
                    return
                }
                DepartmentList = append(DepartmentList, departmentList...)
            }
        }
        return
    }
    err = dfs(d.DingToken.Token, 1)
    if err != nil {
        return
    }
    //取差集查看一下那些部门已经不在来了,进行软删除

    err = global.GLOAB_DB.Clauses(clause.OnConflict{
        Columns:   []clause.Column{{Name: "dept_id"}},
        DoUpdates: clause.AssignmentColumns([]string{"name", "parent_id"}),
    }).Create(&DepartmentList).Error
    //找到不存在的部门进行软删除,同时删除其关系
    Deleted := DiffSilceDept(oldDept, DepartmentList)
    err = global.GLOAB_DB.Select(clause.Associations).Delete(&Deleted).Error
    //根据部门id存储一下部门用户
    for i := 0; i < len(DepartmentList); i++ {
        UserList := make([]DingUser, 0)
        //调用钉钉接口,获取部门中的成员,然后存储进来
        hasMore := true
        for hasMore {
            tempUserList := make([]DingUser, 0)
            d.DeptId = DepartmentList[i].DeptId
            tempUserList, hasMore, err = d.GetUserListByDepartmentID(0, 100)
            if err != nil {
                zap.L().Error("获取部门用户详情失败", zap.Error(err))
            }
            UserList = append(UserList, tempUserList...)
            fmt.Println(i)
            fmt.Println(hasMore)
        }
        //查到用户后,同步到数据库里面,把不在组织架构里面直接删除掉
        //先查一下老的
        oldUserList := make([]DingUser, 0)
        global.GLOAB_DB.Model(&DingDept{DeptId: DepartmentList[i].DeptId}).Association("UserList").Find(&oldUserList)
        //取差集找到需要删除的名单
        userDeleted := DiffSilceUser(oldUserList, UserList)
        err = global.GLOAB_DB.Select(clause.Associations).Delete(&userDeleted).Error
        err = global.GLOAB_DB.Clauses(clause.OnConflict{
            Columns:   []clause.Column{{Name: "user_id"}},
            DoUpdates: clause.AssignmentColumns([]string{"name", "title"}),
        }).Create(&UserList).Error
        //更新用户部门关系,更新的原理是:先把之前该部门的关系全部删除,然后重新添加
        err = global.GLOAB_DB.Model(&DepartmentList[i]).Association("UserList").Replace(UserList)
    }
    return
}

到了这里,关于钉钉企业内部机器人开发——同步组织架构人员信息到数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go-Ldap-Admin | openLDAP 同步钉钉、企业微信、飞书组织架构实践和部分小坑

    目录 一、Docker-compose快速拉起demo测试环境 二、原生部署流程 安装MySQL:5.7数据库 安装openLDAP 修改域名,新增con.ldif 创建一个组织 安装OpenResty 下载后端 下载前端 部署后端 部署前端 三、管理动态字段 钉钉 企业微信 飞书 四、部分报错 Go-Ldap-Admin官网:Go-Ldap-Admin 本文用于记

    2024年02月07日
    浏览(47)
  • 钉钉企业机器人单聊消息发送实践-大数据平台(XSailboat)消息中心消息推送

    在笔者开发的 大数据平台XSailboat 中有 消息中心 模块,用来全平台的消息收集,整理分拆、订阅发送等功能。消息推送方式支持钉钉群聊、钉钉单聊、短信通知。现记录一下企业机器人消息单聊推送的实现过程。 这是官方的开发文档地址:《机器人发送、查询和撤回单聊消

    2024年01月25日
    浏览(44)
  • Outlook无需API开发连接钉钉群机器人,实现新增会议日程自动发送群消息通知

    Outlook用户使用场景: 在企业中,会议和活动的顺利举行对于业务运转和团队协作至关重要。然而,计划的变动总是无法避免,这可能会导致其他人的计划受到影响,打乱原有的安排。为了解决这个问题,许多企业开始使用各种工具和技术来确保信息的及时传递和更新。其中

    2024年02月09日
    浏览(41)
  • 【钉钉】通过钉钉机器人抓取群消息

    一、进入钉钉开放平台中的开发者后台  二、进入应用开发的企业内部开发   三、选择机器人创建应用  四、进入开发管理点击修改  五、配置公网的服务器出口IP以及消息接收地址  六、消息接收代码部分 七、钉钉群@机器人发送消息  后端即可获取到消息,因为已经和我的

    2024年02月12日
    浏览(55)
  • 钉钉机器人推送

     自定义类型机器人文档 自定义机器人发送群消息 - 钉钉开放平台 验证签名文档 自定义机器人的创建和安装 - 钉钉开放平台 php代码实现方式

    2024年01月24日
    浏览(48)
  • java实现钉钉群机器人@机器人获取信息后,机器人回复(机器人接收消息)

    1.需求 鉴于需要使用钉钉群机器人回复,人们提出的问题,需要识别提出的问题中的,后端进行处理实现对应的业务逻辑 2.实现方式 用户@群机器人,附带提出的问题,后端接收消息后识别消息内容,读取到进行对应的业务逻辑操作后,机器人获取返回的信息后

    2024年02月14日
    浏览(54)
  • 对接钉钉机器人发送钉钉通知

    实现效果 话不多说 直接上代码 http工具类

    2024年01月25日
    浏览(46)
  • 钉钉机器人推送消息

    https://open.dingtalk.com/document/ https://open.dingtalk.com/document/resourcedownload/download-server-sdk 就拿java的服务端SDK来说分为两个大的版本:老版本SDK和新版本SDK. https://s01.oss.sonatype.org/?spm=ding_open_doc.document.0.0.4564722fJDmwRj#nexus-search;quick~dingtalk 这种方式只需要在钉钉中拉一个群,人员超过三

    2024年02月09日
    浏览(46)
  • 钉钉机器人发送jira消息到钉钉群聊

    前期准备 1.安装JIRA相关插件 Automation for Jira - Server Lite。 、 2.配置钉钉群机器人 01.钉钉群右上角点击群设置,选择智能群助手,点击添加机器人,选择自定义机器人; 02.给机器人起个名字,消息推送开启,复制出webhook,后面会用到,勾选自定义,填写(

    2024年02月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包