119 lines
3.0 KiB
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
|
|
}
|