EasyMES/WaterCloud.DingTalkService/ProcessInstanceApi.cs
2022-10-20 17:12:54 +08:00

267 lines
13 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using DingTalk.Api;
using DingTalk.Api.Request;
using DingTalk.Api.Response;
using System;
using System.Collections.Generic;
namespace WaterCloud.DingTalk
{
/// <summary>
/// 钉钉审批业务操作
/// 水之云MES项目
/// 相关API开发文档见https://open-doc.dingtalk.com/microapp/serverapi2/ca8r99
/// 需要结合钉钉API接口.Net版本动态库文件TopSdk引用 DingTalk.Api
/// 创建时间2019-4-15
/// </summary>
public class ProcessInstanceApi
{
/// <summary>
/// 发起审批实例
/// </summary>
/// <param name="accessToken"></param>
/// <param name="processinstance">审批示例表单</param>
/// <param name="form"></param>
/// <returns></returns>
public static string Create(string accessToken, Processinstance processinstance)
{
try
{
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/create");
OapiProcessinstanceCreateRequest request = new OapiProcessinstanceCreateRequest();
//request.AgentId = 41605932L; //企业应用标识(ISV调用必须设置)
request.ProcessCode = processinstance.ProcessCode; //审批流的唯一码process_code就在审批流编辑的页面URL中:"PROC-BY6LI83V-4R8T1CHNUX58O0Z6C55M3-DTQJJGEJ-1"
List<OapiProcessinstanceCreateRequest.FormComponentValueVoDomain> formComponentValues = new List<OapiProcessinstanceCreateRequest.FormComponentValueVoDomain>();
OapiProcessinstanceCreateRequest.FormComponentValueVoDomain vo = new OapiProcessinstanceCreateRequest.FormComponentValueVoDomain();
foreach (FormComponentValue item in processinstance.FormComponentValues)
{
switch (item.FieldType)
{
case FormField.singletext:
case FormField.multipletext:
vo.Name = item.Name;
vo.Value = item.Value.ToString();
formComponentValues.Add(vo);
break;
case FormField.image:
vo.Name = item.Name;
vo.Value = item.Value.ToString();
formComponentValues.Add(vo);
break;
case FormField.attach:
vo.Name = item.Name;
vo.Value = item.Value.ToString();
formComponentValues.Add(vo);
break;
case FormField.detail:
vo.Name = item.Name;
var data = item.Value.ToString();
formComponentValues.Add(vo);
break;
}
}
request.FormComponentValues_ = formComponentValues;
request.Approvers = processinstance.Approvers; //审批人userid列表最大列表长度20。多个审批人用逗号分隔按传入的顺序依次审批
request.OriginatorUserId = processinstance.OriginatorUserId; //审批实例发起人的userid
request.DeptId = processinstance.OriginatorDeptId; //发起人所在的部门,如果发起人属于根部门,传-1
request.CcList = string.Join(",", processinstance.CcUserids.ToArray()); //(可选)抄送人userid列表最大列表长度20。多个抄送人用逗号分隔
request.CcPosition = processinstance.CcPosition; //(可选)抄送时间分为START, FINISH, START_FINISH
OapiProcessinstanceCreateResponse response = client.Execute(request, accessToken);
if (response.Errcode == 0)
{
return response.ProcessInstanceId;
}
else
{
throw new Exception(response.Errcode.ToString());
}
}
catch(Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 批量获取审批实例id
/// </summary>
/// <param name="accessToken">accessToken</param>
/// <param name="processCode">审批流的唯一码</param>
/// <param name="useridlist">发起人用户id列表</param>
/// <param name="starttime">查询开始时间</param>
/// <returns></returns>
public static List<string> GetListIds(string accessToken, string processCode,string useridlist,DateTime starttime)
{
try
{
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/listids");
OapiProcessinstanceListidsRequest request = new OapiProcessinstanceListidsRequest();
request.ProcessCode = processCode;
request.StartTime= DingTalkUtils.DateTimeToTimeStamp(starttime); //开始时间。Unix时间戳
request.EndTime=DingTalkUtils.DateTimeToTimeStamp(DateTime.Now.ToUniversalTime()); //结束时间默认取当前时间。Unix时间戳
request.Size=10L; //分页参数每页大小最多传10默认值10
request.Cursor=0L; //分页查询的游标最开始传0后续传返回参数中的next_cursor值默认值0
request.UseridList= useridlist; //发起人用户id列表用逗号分隔最大列表长度10
OapiProcessinstanceListidsResponse response = client.Execute(request, accessToken);
if (response.Errcode == 0)
{
return response.Result.List;
}
else
{
throw new Exception(response.Errcode.ToString());
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 获取单个审批实例
/// </summary>
/// <param name="accessToken">accessToken</param>
/// <param name="process_instance_id">审批实例id</param>
/// <returns></returns>
public static Processinstance GetListIds(string accessToken, string process_instance_id)
{
try
{
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/processinstance/get");
OapiProcessinstanceGetRequest request = new OapiProcessinstanceGetRequest();
request.ProcessInstanceId= process_instance_id;
OapiProcessinstanceGetResponse response = client.Execute(request, accessToken);
if (response.Errcode == 0)
{
Processinstance processinstance = new Processinstance();
processinstance.Title = response.ProcessInstance.Title;
processinstance.CreateTime = response.ProcessInstance.CreateTime;
processinstance.FinishTime = response.ProcessInstance.FinishTime;
processinstance.OriginatorUserId = response.ProcessInstance.OriginatorUserid;
processinstance.OriginatorDeptId = Convert.ToInt32(response.ProcessInstance.OriginatorDeptId);
processinstance.Status = response.ProcessInstance.Status;
processinstance.CcUserids = response.ProcessInstance.CcUserids;
processinstance.Result = response.ProcessInstance.Result;
processinstance.BizAction = response.ProcessInstance.BizAction;
processinstance.BusinessId = response.ProcessInstance.BusinessId;
processinstance.OriginatorDeptName = response.ProcessInstance.OriginatorDeptName;
processinstance.FormComponentValues = new List<FormComponentValue>();
foreach (OapiProcessinstanceGetResponse.FormComponentValueVoDomain item in response.ProcessInstance.FormComponentValues)
{
FormComponentValue form = new FormComponentValue();
form.Name = item.Name;
form.Value = item.Value;
form.ExtValue = item.ExtValue;
processinstance.FormComponentValues.Add(form);
}
foreach (OapiProcessinstanceGetResponse.OperationRecordsVoDomain item in response.ProcessInstance.OperationRecords)
{
OperationRecord model = new OperationRecord();
model.UserId = item.Userid;
model.Date = Convert.ToDateTime(item.Date); ;
model.OperationType = item.OperationType;
model.OperationResult = item.OperationResult;
model.Remark = item.Remark;
processinstance.OperationRecords.Add(model);
}
foreach (OapiProcessinstanceGetResponse.TaskTopVoDomain item in response.ProcessInstance.Tasks)
{
Task model = new Task();
model.UserId = item.Userid;
model.TaskStatus = item.TaskStatus;
model.TaskResult = item.TaskResult;
model.CreateTime = Convert.ToDateTime(item.CreateTime);
model.FinishTime = Convert.ToDateTime(item.FinishTime);
processinstance.Tasks.Add(model);
}
return processinstance;
}
else
{
throw new Exception(response.Errcode.ToString());
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 获取用户待审批数量
/// </summary>
/// <param name="accessToken">accessToken</param>
/// <param name="userid">用户Id</param>
/// <returns></returns>
public static long GetTodoNum(string accessToken,string userid)
{
try
{
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/process/gettodonum");
OapiProcessGettodonumRequest req = new OapiProcessGettodonumRequest();
req.Userid= userid;
OapiProcessGettodonumResponse response = client.Execute(req, accessToken);
if (response.Errcode == 0)
{
return response.Count;
}
else
{
throw new Exception(response.Errcode.ToString());
}
}
catch(Exception)
{
return 0;
}
}
/// <summary>
/// 获取用户可见的审批模板
/// </summary>
/// <param name="accessToken">accessToken</param>
/// <param name="userid">用户ID,不传表示获取企业的所有模板</param>
/// <returns></returns>
public static List<ProcessTemplate> GetProcessListByUserid(string accessToken, string userid="")
{
try
{
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/process/listbyuserid");
OapiProcessListbyuseridRequest request = new OapiProcessListbyuseridRequest();
if (!string.IsNullOrEmpty(userid))
{
request.Userid = userid;
}
request.Offset=0L;
request.Size=100L;
OapiProcessListbyuseridResponse response = client.Execute(request, accessToken);
if (response.Errcode == 0)
{
List<ProcessTemplate> list = new List<ProcessTemplate>();
foreach (OapiProcessListbyuseridResponse.ProcessTopVoDomain item in response.Result.ProcessList)
{
ProcessTemplate form = new ProcessTemplate();
form.Name = item.Name;
form.IconUrl = item.IconUrl;
form.ProcessCode = item.ProcessCode;
form.Url = item.Url;
list.Add(form);
}
return list;
}
else
{
throw new Exception(response.Errcode.ToString());
}
}
catch (Exception)
{
return null;
}
}
}
}