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