godingtalk/top_api_approval.go

188 lines
6.5 KiB
Go
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.

/*
* Author Kevin Zhu
*
* Direct questions, comments to <ipandtcp@gmail.com>
*/
package godingtalk
import (
"encoding/json"
"errors"
"net/url"
"strconv"
"strings"
"time"
)
const (
topAPICreateProcInstMethod = "dingtalk.smartwork.bpms.processinstance.create"
topAPIGetProcInstMethod = "dingtalk.smartwork.bpms.processinstance.get"
topAPIListProcInstMethod = "dingtalk.smartwork.bpms.processinstance.list"
)
type TopAPICreateProcInst struct {
// 审批模板code
ProcessCode string `json:"process_code"`
// 发起人UID
OriginatorUID string `json:"originator_user_id"`
// 发起人所在部门
DeptID int `json:"dept_id"`
// 审批人列表
Approvers []string `json:"approvers"`
// 抄送人列表
CCList []string `json:"cc_list"`
//抄送时间,分为START,FINISH,START_FINISH
CCPosition string `json:"cc_position"`
// 审批单内容, Name为审批模板中的列名 value 为该列的值
FormCompntValues []ProcInstCompntValues `json:"form_component_values"`
}
type ProcInst struct {
ProcInstID string `json:"process_instance_id"`
Title string `json:"title"`
CreateTime string `json:"create_time"`
FinishTime string `json:"finish_time"`
OriginatorUID string `json:"originator_userid"`
Status string `json:"status"`
ApproverUIDS []string `json:"approver_userids"`
CCUIDS []string `json:"cc_userids"`
Result string `json:"result"`
BusinessID string `json:"business_id"`
FormCompntValues []ProcInstCompntValues `json:"form_component_values"` // 表单详情列表
Tasks []_ProcInstTasks `json:"tasks"` // 任务列表
OperationRecords []_ProcInstOperationRecords `json:"operation_records"` // 操作记录列表
OriginatorDeptID string `json:"originator_dept_id"`
OriginatorDeptName string `json:"originator_dept_name"`
}
type ProcInstCompntValues struct {
Name string `json:"name"`
Value string `json:"value"`
ExtValue string `json:"ext_value"`
}
type _ProcInstOperationRecords struct {
UID string `json:"userid"`
Date string `json:"date"`
Type string `json:"operation_type"`
Result string `json:"operation_result"`
Remark string `json:"remark"`
}
type _ProcInstTasks struct {
UID string `json:"userid"`
Status string `json:"task_status"`
Result string `json:"task_result"`
CreateTime string `json:"create_time"`
FinishTime string `json:"finish_time"`
}
type topAPICreateProcInstResp struct {
topAPIErrResponse
OK struct {
Errcode int `json:"ding_open_errcode"`
ErrMsg string `json:"error_msg"`
IsSuccess bool `jons:"is_success"`
ProcInstID string `json:"process_instance_id"`
} `json:"result"`
RequestID string `json:"request_id"`
}
// 发起审批
func (c *DingTalkClient) TopAPICreateProcInst(data TopAPICreateProcInst) (string, error) {
var resp topAPICreateProcInstResp
values, err := json.Marshal(data.FormCompntValues)
if err != nil {
return "", err
}
form := url.Values{}
form.Add("method", topAPICreateProcInstMethod)
form.Add("cc_list", strings.Join(data.CCList, ","))
form.Add("dept_id", strconv.Itoa(data.DeptID))
form.Add("approvers", strings.Join(data.Approvers, ","))
form.Add("cc_position", data.CCPosition)
form.Add("process_code", data.ProcessCode)
form.Add("originator_user_id", data.OriginatorUID)
form.Add("form_component_values", string(values))
if c.AgentID != "" {
form.Add("agent_id", c.AgentID)
}
return resp.OK.ProcInstID, c.topAPIRequest(form, &resp)
}
type topAPIGetProcInstResp struct {
Ok struct {
ErrCode int `json:"ding_open_errcode"`
ErrMsg string `json:"error_msg"`
Success bool `json:"success"`
ProcInst ProcInst `json:"process_instance"`
} `json:"result"`
RequestID string `json:"request_id"`
topAPIErrResponse
}
// 根据审批实例id获取单条审批实例详情
func (c *DingTalkClient) TopAPIGetProcInst(pid string) (ProcInst, error) {
var resp topAPIGetProcInstResp
reqForm := url.Values{}
reqForm.Add("process_instance_id", pid)
reqForm.Add("method", topAPIGetProcInstMethod)
err := c.topAPIRequest(reqForm, &resp)
if err != nil {
return resp.Ok.ProcInst, err
}
resp.Ok.ProcInst.ProcInstID = pid
return resp.Ok.ProcInst, err
}
type ListProcInst struct {
ApproverUIDS []string `json:"approver_userid_list"`
CCUIDS []string `json:"cc_userid_list"`
FormCompntValues []ProcInstCompntValues `json:"form_component_values"`
ProcInstID string `json:"process_instance_id"`
Title string `json:"title"`
CreateTime string `json:"create_time"`
FinishTime string `json:"finish_time"`
OriginatorUID string `json:"originator_userid"`
Status string `json:"status"`
BusinessID string `json:"business_id"`
OriginatorDeptID string `json:"originator_dept_id"`
ProcInstResult string `json:"process_instance_result"` // "agree",
}
type TopAPIListProcInstResp struct {
topAPIErrResponse
OK struct {
ErrCode int `json:"ding_open_errcode"`
ErrMsg string `json:"error_msg"`
Success bool `json:"success"`
Result struct {
List []ListProcInst `json:"list"`
NextCursor int `json:"next_cursor"`
} `json:"result"`
} `json:"result"`
RequestID string `json:"request_id"`
}
// 获取审批实例列表
// Note: processCode 官方不会检查错误请保证processCode正确
func (c *DingTalkClient) TopAPIListProcInst(processCode string, startTime, endTime time.Time, size, cursor int, useridList []string) (TopAPIListProcInstResp, error) {
var resp TopAPIListProcInstResp
if size > 10 {
return resp, errors.New("Max size is 10")
}
reqForm := url.Values{}
reqForm.Add("process_code", processCode)
reqForm.Add("start_time", strconv.FormatInt(startTime.UnixNano()/int64(time.Millisecond), 10))
reqForm.Add("end_time", strconv.FormatInt(endTime.UnixNano()/int64(time.Millisecond), 10))
reqForm.Add("size", strconv.Itoa(size))
reqForm.Add("cursor", strconv.Itoa(cursor))
reqForm.Add("userid_list", strings.Join(useridList, ","))
reqForm.Add("method", topAPIListProcInstMethod)
return resp, c.topAPIRequest(reqForm, &resp)
}