C# 钉钉审批流使用

1.了解钉钉审批流API接口的使用

钉钉审批流API
安装 RestSharp 包

2.建立请求和接受的Dto

      /// <summary>
    /// 请求 审批流实例ID
    /// </summary>
    public class RequestProcessInstance
    {
        public string process_code { get; set; }
        public string start_time { get; set; }
        public string end_time { get; set; }
        public string size { get; set; }
        public string cursor { get; set; }
        public string userid_list { get; set; }
    }

    /// <summary>
    /// 返回  审批流实例ID
    /// </summary>
    public class ResponseProcessInstance
    {
        /// <summary>
        /// 返回码
        /// </summary>
        public string errcode { get; set; }
        public string request_id { get; set; }
        public ResponseProcessInstanceResult result { get; set; }

    }
    public class ResponseProcessInstanceResult
    {
        /// <summary>
        /// 审批实例id列表
        /// </summary>
        public List<string> list { get; set; }
        /// <summary>
        /// 表示下次查询的游标,当返回结果没有该字段时表示没有更多数据了
        /// </summary>
        public string next_cursor { get; set; }

    }


    /// <summary>
    /// 返回 审批流实例ID详情
    /// </summary>
    public class ResponseProcessInstanceDetails
    {
        /// <summary>
        /// 状态码
        /// </summary>
        public string errcode { get; set; }
        /// <summary>
        /// 实例详情
        /// </summary>
        public Process_instance process_instance { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string request_id { get; set; }
    }
    public class Form_component_values
    {
        /// <summary>
        /// 
        /// </summary>
        public string component_type { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string id { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string name { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string value { get; set; }
    }
    public class Process_instance
    {
        /// <summary>
        /// 开始时间
        /// </summary>
        public DateTime create_time { get; set; }
        /// <summary>
        /// 结束时间
        /// </summary>
        public DateTime finish_time { get; set; }
        /// <summary>
        /// 表单详情列表
        /// </summary>
        public List<Form_component_values> form_component_values { get; set; }

        /// <summary>
        /// 发起部门
        /// </summary>
        public string originator_dept_id { get; set; }
        /// <summary>
        /// 发起部门名称
        /// </summary>
        public string originator_dept_name { get; set; }
        /// <summary>
        /// 发起人
        /// </summary>
        public string originator_userid { get; set; }
        /// <summary>
        /// 审批结果,分为 agree 和 refuse
        /// </summary>
        public string result { get; set; }
        /// <summary>
        /// 审批状态,分为NEW(新创建)RUNNING(运行中)TERMINATED(被终止)COMPLETED(完成)
        /// </summary>
        public string status { get; set; }
        /// <summary>
        /// 审批实例标题
        /// </summary>
        public string title { get; set; }
    }

3.创建调用钉钉审批流API的方法

需要获取钉钉的ACCESSTOken,看官网即可

        /// <summary>
        /// 根据审批流获取审批流实例List
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public static List<string>  GetApproveProcessInstance(RequestProcessInstance dto)
        {
            List<string> result = new List<string>();
            var token = GetDingDingAccesToken(); //获取钉钉的ACCESSTOken
            var tempDto = GetResponseProcessInstance(dto, token);
            tempDto.result.list.ForEach(a=>result.Add(a));

            //因为一次性最多返回10条,所以还需要再次请求其余的数据
            while (tempDto.result.next_cursor!=null)
            {
                dto.cursor = tempDto.result.next_cursor;
                tempDto = GetResponseProcessInstance(dto, token);
                tempDto.result.list.ForEach(a => result.Add(a));
                if (tempDto.result.next_cursor == null)
                {
                    break;
                }
            }
            return result;
        }

        /// <summary>
        /// 批量获取审批流实例ID   参考文档:https://ding-doc.dingtalk.com/doc#/serverapi2/hh8lx5
        /// </summary>
        /// <param name="dto"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        private static ResponseProcessInstance GetResponseProcessInstance(RequestProcessInstance dto,string token)
        {
            //发起钉钉请求
            var client = new RestClient("https://oapi.dingtalk.com/topapi/processinstance/listids?access_token=" + token);
            client.Timeout = -1;
            var request = new RestRequest(Method.POST);
            request.AddHeader("Content-Type", "application/json");
            string json = JsonConvert.SerializeObject(dto);
            request.AddParameter("application/json", json, ParameterType.RequestBody);
            IRestResponse response = client.Execute(request);
            var tempDto = JsonConvert.DeserializeObject<ResponseProcessInstance>(response.Content);
            return tempDto;
        }


        /// <summary>
        /// 获取钉钉的AccessToken
        /// </summary>
        /// <returns></returns>
        private static string GetDingDingAccesToken()
        {
            string token ="";//看官方文档
            return token;
        }

        /// <summary>
        /// 根据审批实例id调用此接口获取审批实例详情,包括审批表单信息、操作记录列表、操作人、抄送人、审批任务列表等。
        /// </summary>
        /// <param name="process_instance_ids"></param>
        /// <returns></returns>
        public static List<ResponseProcessInstanceDetails> GetResponseProcessInstanceDetails(List<string> process_instance_ids)
        {
            List<ResponseProcessInstanceDetails> result = new List<ResponseProcessInstanceDetails>();
            string token = GetDingDingAccesToken();
            process_instance_ids.ForEach(a => { result.Add(GetResponseProcessInstanceDetails(a,token)); });
            return result;
        }


        /// <summary>
        /// 钉钉 根据用户ID 获取用户信息详情,可用Jobject转化
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public static string GetUserByDingDingID(string id)
        {
            var client = new RestClient("https://oapi.dingtalk.com/user/get?access_token="+GetDingDingAccesToken()+"&userid="+id+"");
            client.Timeout = -1;
            var request = new RestRequest(Method.GET);
            IRestResponse response = client.Execute(request);
            return (response.Content);
        }

        /// <summary>
        /// 时间转换 毫秒级别的时间戳
        /// </summary>
        /// <param name="dateTime"></param>
        /// <returns></returns>
        public static string GetChinaTicks(DateTime dateTime)
        {
            //北京时间相差8小时,TimeZoneInfo.Local本地不太有用
            DateTime startTime = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1,8, 0, 0, 0), TimeZoneInfo.Local);
            long t = (dateTime.Ticks - startTime.Ticks) / 10000;   //除10000调整为13位   
            return t.ToString();
        }

4.使用例子

 public static List<ResponseProcessInstanceDetails> GetUseCarList(DateTime Date)
        {
            var dto = new RequestProcessInstance();//请求 获取审批流ID对应的所有进程
            dto.process_code = "asdasd";//钉钉审批的process_code
            dto.start_time = GetChinaTicks(Date);//转换成时间戳
            dto.end_time = GetChinaTicks(Date.AddMonths(1).AddSeconds(-1));
            var listApproveProcessInstance = GetApproveProcessInstance(dto);//获取到所有的审批流进程
            List<ResponseProcessInstanceDetails> listDetails = GetResponseProcessInstanceDetails(listApproveProcessInstance);//根据所有的进程获取到所有进程的详情
            return listDetails;
        }
posted @ 2020-05-15 09:24  Alex_Mercer  阅读(2780)  评论(0编辑  收藏  举报