首页 > 其他分享 >钉钉同步基础数据(用户和部门)

钉钉同步基础数据(用户和部门)

时间:2023-11-01 16:08:23浏览次数:37  
标签:deptId 同步 adminUserDO String 用户 部门 token new throws

1、创建钉钉应用

1.1、 登录钉钉开放平台

https://open-dev.dingtalk.com/

1.2、创建钉钉应用

点击开发者后台

钉钉同步基础数据(用户和部门)_API

点击应用开发

钉钉同步基础数据(用户和部门)_API_02

点击创建应用

钉钉同步基础数据(用户和部门)_数据_03

创建成功之后需要开通对应的权限

钉钉同步基础数据(用户和部门)_开放平台_04

2、java集成钉钉开发

2.1、导入依赖

<dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>alibaba-dingtalk-service-sdk</artifactId>
      <version>2.0.0</version>
</dependency>

2.2、在若依字典管理中添加相关配置

字典数据

图中APP_KEY 、APP_SECERT从钉钉开放平台获取

图中ACCESS_TOKEN_URL是获取token值

图中DEPT_API是获取部门信息的URL值

图中USER_ID_API是获取部门下有哪些用户id集合

图中USER_DETAIL_API是根据用户id查询到用户详细信息

2.3、同步部门代码开发

示例实现同步父节点下的所有部门信息

2.3.1、controller层

/**
     * 同步部门数据 全量同步
     */
    @GetMapping("/syncListDept")
    @Operation(summary = "同步部门数据")
    public void syncListDept() throws ApiException {
        deptService.syncListDept();
    }

2.3.2、service层

接口层

/**
     * 同步部门数据
     */
    void syncListDept() throws ApiException;

实现层

@Override
    public void syncListDept() throws ApiException {
        //获取accessToken
        String token = accessTokenUtils.getToken();
        this.insertListDept(token,1L);
    }

    /**
     * 根据部门id获取子部门列表
     * @param token
     * @param deptId
     */
    private void insertListDept(String token,Long deptId) throws ApiException {
        DeptDO deptDO = deptMapper.selectById(deptId);
        OapiV2DepartmentListsubResponse rootObject = this.getListDept(token, deptId);
        //判断是否成功
        checkIsSuccess(rootObject);
        List<OapiV2DepartmentListsubResponse.DeptBaseResponse> result = rootObject.getResult();
        if(result.size() == 0){
            return;
        }
        int num = 1;
        for (OapiV2DepartmentListsubResponse.DeptBaseResponse deptBaseResponse : result) {
            DeptDO sd = new DeptDO();
            // 部门ID
            sd.setId(deptBaseResponse.getDeptId());
            // 部门名称
            sd.setName(deptBaseResponse.getName());
            // 父级部门名称
            sd.setParentId(deptDO.getId());
            sd.setStatus(0);
            sd.setSort(num++);
            DeptDO dept = deptMapper.selectById(deptBaseResponse.getDeptId());
            if(null==dept){
                deptMapper.insert(sd);
            }else {
                deptMapper.updateById(sd);
            }
            insertListDept(token,sd.getId());
        }
    }

    /**
     * 获取子部门详情
     * @param token
     * @param deptId
     * @return
     */
    private OapiV2DepartmentListsubResponse getListDept(String token,Long deptId) throws ApiException {
        DingTalkClient client = new DefaultDingTalkClient(DictFrameworkUtils.parseDictDataValue(DictTypeConstants.DINGDING_INTEGRATION, DingDingEnum.DEPT_API.getStr()));
        OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
        req.setDeptId(deptId);
        return client.execute(req, token);
    }

    public void checkIsSuccess(OapiV2DepartmentListsubResponse response){
        if (0L!=response.getErrcode()) {
            throw new ServiceException(new ErrorCode(response.getErrcode().intValue(),response.getErrmsg()));
        }
    }

2.3.3、获取token工具类

/***
 * @title yudao-cloud
 * @description 获取access_token工具类
 * @author wangxiaoqi
 * @version 1.0.0
 * @create 2023-08-30 10:42
 **/
@Component
public class AccessTokenUtils {

    @Cacheable(value = RedisKeyConstants.ACCESS_TOKEN + "#180")
    public  String getToken() throws RuntimeException {
        try {
            DefaultDingTalkClient client = new DefaultDingTalkClient(DictFrameworkUtils.parseDictDataValue(DictTypeConstants.DINGDING_INTEGRATION, DingDingEnum.ACCESS_TOKEN_URL.getStr()));
            OapiGettokenRequest request = new OapiGettokenRequest();
            request.setAppkey(DictFrameworkUtils.parseDictDataValue(DictTypeConstants.DINGDING_INTEGRATION, DingDingEnum.APP_KEY.getStr()));
            request.setAppsecret(DictFrameworkUtils.parseDictDataValue(DictTypeConstants.DINGDING_INTEGRATION, DingDingEnum.APP_SECRET.getStr()));
            request.setHttpMethod("GET");
            OapiGettokenResponse response = client.execute(request);
            return response.getAccessToken();
        } catch (ApiException e) {
            throw new RuntimeException();
        }
    }

}

2.4、最终得到的数据

2.5、同步用户代码开发

示例实现获取一个部门下所有用户

2.5.1、controller层

@PostMapping("/syncUser")
    @Operation(summary = "同步用户")
    public void syncUser(@RequestParam("deptId") String deptId) throws Exception {
        userService.syncUser(deptId);
    }

2.5.2、service层

接口层

/**
     * 同步可部门下的用户信息
     * @param deptId  部门id
     */
    void syncUser(String deptId) throws ApiException;

实现层

@Override
    public void syncUser(String deptId) throws ApiException {
        String token = accessTokenUtils.getToken();
        //获取部门下的用户Id集合
        OapiUserListidResponse response = getUserIdList(token, Long.parseLong(deptId));
        if(response.isSuccess()){
            List<String> useridList = response.getResult().getUseridList();
            for (String userId : useridList) {
                //获取用户的详情信息
                OapiV2UserGetResponse userDetailResponse = getUserDetail(userId, token);
                if(userDetailResponse.isSuccess()){
                    OapiV2UserGetResponse.UserGetResponse result = userDetailResponse.getResult();
                    AdminUserDO adminUserDO = new AdminUserDO();
                    adminUserDO.setUsername(result.getMobile());
                    adminUserDO.setNickname(result.getName());
                    adminUserDO.setDeptId(Long.parseLong(deptId));
                    adminUserDO.setMobile(result.getMobile());
                    // 校验正确性
                    validateUserForCreateOrUpdate(null, adminUserDO.getUsername(), adminUserDO.getMobile(), adminUserDO.getEmail(),
                            adminUserDO.getDeptId(), adminUserDO.getPostIds());
                    // 默认开启
                    adminUserDO.setStatus(CommonStatusEnum.ENABLE.getStatus());
                    // 加密密码
                    adminUserDO.setPassword(encodePassword("123456"));
                    userMapper.insert(adminUserDO);
                }
            }
        }

    }

    /**
     * 通过部门id获取部门下的所有用户Ids
     * @param token
     * @param deptId
     * @return
     * @throws ApiException
     */
    private OapiUserListidResponse getUserIdList(String token,Long deptId) throws ApiException {
        DingTalkClient client = new DefaultDingTalkClient(DictFrameworkUtils.parseDictDataValue(DictTypeConstants.DINGDING_INTEGRATION, DingDingEnum.USER_ID_API.getStr()));
        OapiUserListidRequest req = new OapiUserListidRequest();
        req.setDeptId(deptId);
        return client.execute(req, token);
    }

    /**
     * 通过用户id获取用户详情信息
     * @param userId
     * @param token
     * @return
     * @throws ApiException
     */
    private OapiV2UserGetResponse getUserDetail(String userId,String token) throws ApiException {
        DingTalkClient client = new DefaultDingTalkClient(DictFrameworkUtils.parseDictDataValue(DictTypeConstants.DINGDING_INTEGRATION, DingDingEnum.USER_DETAIL_API.getStr()));
        OapiV2UserGetRequest req = new OapiV2UserGetRequest();
        req.setUserid(userId);
        return client.execute(req, token);
    }


标签:deptId,同步,adminUserDO,String,用户,部门,token,new,throws
From: https://blog.51cto.com/u_13812072/8128826

相关文章

  • logstash采用了增量同步后想做全新的同步的方法
     1.文件同步到esNosincedb_pathset,generatingonebasedonthe"path"setting{:sincedb_path=>"/opt/logstash-6.8.5/data/plugins/inputs/file/.sincedb_f019a9f5e77dadb5d6981e37ca0b16f6",:path=>["/tmp/myfile/*.log"]}将.sincedb......
  • 使用logstash同步mysql到ES
    环境:OS:Centos7es:6.8.5logstash:6.8.5mysql:5.7 1.mysql创建表createtabletb_es(idbigint(20)unsignedNOTNULLAUTO_INCREMENTCOMMENT'主键id',namevarchar(32)notnull,f_intint,f_doudouble(10,2),f_flofloat(9,2),create_timet......
  • 用户管理
    第三章用户管理3.1用户/组概览:3.1.1用户标识:UID与GIDUID:每个用户都有一个唯一的用户标识(UID),用于系统识别用户。GID:每个用户还属于一个或多个用户组,每个用户组也有一个唯一的组标识(GID)。可用id命令查看当前用户登录信息:3.1.2用户/组相关文件在Linux系统中,所有用户的用户名......
  • mysql添加非 root 级别用户
    进入mysql容器内部dockerexec-itCOMMAND/bash输入密码登录MySQL回车输入密码passwordroot@94c490e7da78:/#mysql-pEnterpassword:添加数据库先使用root用户添加数据库:--进入sql服务后首先查看有哪些数据库showdatabases;--若没有新建一个CREATEDATABASEdatabas......
  • obsidian实现安卓、windowl同步(Remotely Save+腾讯云对象存储)
    1obsidian安卓端下载https://mobile.softpedia.com/apk/obsidian/2同步思路本文的同步方案并不是以下方案,个人没有采用以下方案。2.1方案1:坚果云网盘方案(没采用此方案)相当于把坚果云作为一个网盘。只需要在电脑端和手机端,同时安装坚果云软件,就可以实现文件在电脑端和手机端同步......
  • Linux时间校准、时间同步(ntpdate及C代码NTP客户端代码校准示例)
    背景机器每次机启后时间就会出现异常,因为机器无法访问外网,只能访问局域网的ntp服务,所以需要保证局域网内部有ntp服务,如何安装ntp服务,参考Ubuntu20.04Ntp服务安装及验证。网络时间协议NetworkTimeProtocol(NTP)是一种确保时钟保持准确的方法。如果可以访问互联网,只需安装ntp......
  • 用户画像
    ......
  • openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置
    openGauss学习笔记-111openGauss数据库管理-管理用户及权限-用户权限设置111.1给用户直接授予某对象的权限给用户直接授予某对象的权限,请使用GRANT。将Schema中的表或者视图对象授权给其他用户或角色时,需要将表或视图所属Schema的USAGE权限同时授予该用户或角色。否则用户或......
  • linux用户权限相关命令笔记
     1,用户和权限的基本概念 1.1ls扩展 ls-l  ......
  • Flink消费kafka数据同步问题排查
    Flink消费kafka数据同步问题排查https://mp.weixin.qq.com/s/EZbCKHBI_JrsF0yJndhe8QFlink消费kafka数据同步问题排查原创 任天兵 哈啰技术 2023-10-3117:31 发表于上海 我们有一个flink任务,消费的kafka的数据,写入到es,非常简单的逻辑,但是出现了数据丢失的情况,之前没遇......