dingding/service/dingtalk-service.go

119 lines
3.0 KiB
Go

package service
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strconv"
"strings"
"github.com/sirupsen/logrus"
"github.com/spf13/viper"
"myschools.me/suguo/godingtalk"
"myschools.me/wyh/dingd.git/model"
)
var client *godingtalk.DingTalkClient
func dingtalkClient() (*godingtalk.DingTalkClient, error) {
if client != nil {
if err := client.RefreshAccessToken(); err != nil {
client = nil
return nil, err
}
return client, nil
}
client = godingtalk.NewDingTalkClient(viper.GetString("dingtalk.corpid"), viper.GetString("dingtalk.corpsercet"))
client.AgentID = viper.GetString("dingtalk.agentid")
if err := client.RefreshAccessToken(); err != nil {
return nil, err
}
return client, nil
}
//部门详情
func dingtalkDeptDetail(deptid *int) (*godingtalk.Department, error) {
client, err := dingtalkClient()
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "dingtalkDeptDetail",
}).Warnf("dingtalkClient: %s", err.Error())
return nil, err
}
dept, err := client.DepartmentDetail(*deptid)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "dingtalkDeptDetail",
}).Warnf("client.DepartmentDetail: %s", err.Error())
return nil, err
}
return &dept, nil
}
func dingtalkDepartment() (*[]godingtalk.Department, error) {
client, err := dingtalkClient()
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "dingtalkDepartment",
}).Warnf("dingtalkClient: %s", err.Error())
return nil, err
}
depts, err := client.DepartmentList()
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "dingtalkDepartment",
}).Warnf("client.DepartmentList: %s", err.Error())
return nil, err
}
if depts.ErrCode != 0 {
return nil, fmt.Errorf("dingtalk: errcode=%d, errmsg=%s", depts.ErrCode, depts.ErrMsg)
}
return &depts.Departments, nil
}
// 发送工作通知
func dingtalkWorkMessage(msg *model.Msg, toalluser bool, useridlist, reqid *string) (*model.MsgResp, error) {
client, err := dingtalkClient()
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "dingtalkDepartment",
}).Warnf("dingtalkClient: %s", err.Error())
return nil, err
}
agentid, _ := strconv.Atoi(client.AgentID)
msgreq := &model.MsgReq{
AgentID: agentid,
UseridList: *useridlist,
ToAllUser: toalluser,
Msg: *msg,
}
bb, err := json.Marshal(msgreq)
if err != nil {
logrus.Println(err)
}
b1 := strings.NewReader(string(bb))
resp, err := http.Post(fmt.Sprintf("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token=%s", client.AccessToken), "application-json", b1)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "MessagePush",
"ReqID": reqid,
}).Warnf("http.Post: %s", err.Error())
return nil, err
}
result := &model.MsgResp{}
n2, err := ioutil.ReadAll(resp.Body)
if err != nil {
logrus.Println(err)
}
err = json.Unmarshal(n2, &result)
if err != nil {
logrus.Println(err)
}
if result.Errcode != 0 {
return nil, fmt.Errorf("dingtalk: errcode=%d", result.Errcode)
}
return result, nil
}