如何拉取钉钉的外出、出差审批单

拉取钉钉的外出、出差审批单

出差、外出审批入口如图所示:

如何拉取钉钉的外出、出差审批单_第1张图片

钉钉开放平台创建应用

登录钉钉开放平台,并创建钉钉应用用于授权
https://open-dev.dingtalk.com/fe/app#/corp/app

创建应用

如何拉取钉钉的外出、出差审批单_第2张图片

设置应用服务器出口IP,也就是白名单IP

如何拉取钉钉的外出、出差审批单_第3张图片

可设置多个,一般为了方便调试,除了测试环境主机IP、线上环境主机IP,还要加上用于开发的电脑的公网IP,直接百度“IP”可查看本机公网IP。

其他什么应用首页地址之类的随便填写即可

设置应用权限

一般需要设置OA审批和通讯录管理中的一些权限,可根据实际开发目标开通权限,不知道如何抉择,可以都申请。
如何拉取钉钉的外出、出差审批单_第4张图片

开发前提准备

1、应用的appKey,appSecret

2、出差流程code、外出流程code
这两个code最好是主管理员,子管理员不知道能否获取。
如何拉取钉钉的外出、出差审批单_第5张图片
如何拉取钉钉的外出、出差审批单_第6张图片
如何拉取钉钉的外出、出差审批单_第7张图片如何拉取钉钉的外出、出差审批单_第8张图片

加入钉钉的依赖

     <dependency>
            <groupId>com.aliyungroupId>
            <artifactId>alibaba-dingtalk-service-sdkartifactId>
            <version>2.0.0version>
        dependency>

拉取审批单的钉钉工具类

package com.yuantu.marketing.util;

import com.alibaba.fastjson.JSON;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*;
import com.taobao.api.ApiException;
import com.yuantu.marketing.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 钉钉工具类
 */
@Slf4j
@Component
public class DingDingUtil {

    //应用的appKey
    private final static String APPKEY ="XXXXXXXXXXXXXX";
    //应用的appSecret
    private final static String APPSECRET="XXXXXXXXXXXXXX";
    //出差流程code
    public final static String TRAVELWORK_PROCESS_CODE = "PROC-XXXXXXXXX";
	//外出流程code
    public final static String PUBLIC_PROCESS_CODE = "PROC-XXXXXXXXX";



    /**
     * 获取access_token
     * @return token
     */
    public static String getToken (){
        Object object = LocalCacheClient.get("access_token");
        if(object != null){
            return object.toString();
        }
        DefaultDingTalkClient client = new
                DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
        OapiGettokenRequest request = new OapiGettokenRequest();
        request.setAppkey(DingDingUtil.APPKEY);
        request.setAppsecret(DingDingUtil.APPSECRET);
        request.setHttpMethod("GET");
        try {
            OapiGettokenResponse response = client.execute(request);
            LocalCacheClient.set("access_token", response.getAccessToken(),7200*1000);
            if(!response.isSuccess()) {
                log.error("调用钉钉接口失败:"+response.getMessage()); 
            }
            return response.getAccessToken();
        } catch (ApiException e) {
            log.error(DingDingUtil.SYSTEM_ERROR, e); 
        }
        return null;
    }

    /**
     * 获取审批实例ID列表
     * @param processCode 进程code
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param cursor 第几批
     * @param size 每批多少个
     * @return 钉钉返回结果
     */
    public static OapiProcessinstanceListidsResponse.PageResult getProcessIds(String processCode, Long startTime, Long endTime, long cursor, long size) throws ApiException {

        String url = "https://oapi.dingtalk.com/topapi/processinstance/listids";
        DingTalkClient client = new DefaultDingTalkClient(url);
        OapiProcessinstanceListidsRequest request = new OapiProcessinstanceListidsRequest();
        request.setProcessCode(processCode);
        request.setStartTime(startTime);
        request.setEndTime(endTime);
        request.setSize(size);
        request.setCursor(cursor);
        OapiProcessinstanceListidsResponse response = client.execute(request, DingDingUtil.getToken());
        if(!response.isSuccess()) {
           log.error("调用钉钉接口失败:"+response.getMessage()); 
        }
        return response.isSuccess()?response.getResult():null;

    }

    /**
     * 获取规定时间内的所有审批id列表
     *
     * @param processCode 审批类型code(出差 or 外出)
     * @return 审批实例列表
     */
    public static List<String> getAllProcessIdList(String processCode, long startTime, long endTime) throws ApiException {
        List<String> processIds = new ArrayList<>();
        long cursor = 0L;
        long size = 10L;
        //获取审批单ID集合
        OapiProcessinstanceListidsResponse.PageResult result = getProcessIds(processCode, startTime, endTime, cursor, size);
        while (result != null && result.getNextCursor() != null) {
            processIds.addAll(result.getList());
            cursor = result.getNextCursor();
            result = DingDingUtil.getProcessIds(processCode, startTime, endTime, cursor, size);
        }
        if (result != null && result.getList() != null && result.getList().size() > 0) {
            processIds.addAll(result.getList());
        }
        return processIds;
    }

    /**
     * 获取审批实例详情
     * @param processInstanceId 审批实例ID
     * @param index 用于重试机制的计数器
     * @return 审批实例详情
     */
    public static OapiProcessinstanceGetResponse.ProcessInstanceTopVo getProcessInfo(String processInstanceId) {
        try {
            //重试机制
            String url = "https://oapi.dingtalk.com/topapi/processinstance/get";
            DingTalkClient client = new DefaultDingTalkClient(url);
            OapiProcessinstanceGetRequest request = new OapiProcessinstanceGetRequest();
            request.setProcessInstanceId(processInstanceId);
            OapiProcessinstanceGetResponse response = client.execute(request, DingDingUtil.getToken());
            if(Objects.isNull(response) || !response.isSuccess()) {
                log.error("调用钉钉接口失败:"+response.getMessage()); 
            }
            return response.isSuccess()?response.getProcessInstance():null;
        } catch (ApiException e) {
            log.error(DingDingUtil.SYSTEM_ERROR, e); 
        }
        return null;
    }  

具体的调用方法以及解析方法,就不拿出来了,基本只要在服务器出口IP中,配置本地公网IP,防止出现不在白名单中的类似报错,就可以顺利调用。




–我是“三七有脾气”,一个在互联网"苟且偷生"的Java程序员
“如果感觉博客对你有用,麻烦给个点赞、评论、收藏,谢谢

你可能感兴趣的:(第三方集成,java)