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;
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM