109 lines
2.4 KiB
Go
109 lines
2.4 KiB
Go
package dingtalk
|
|
|
|
import (
|
|
"ai_scheduler/internal/data/constants"
|
|
"ai_scheduler/internal/data/impl"
|
|
"ai_scheduler/internal/data/model"
|
|
"ai_scheduler/internal/entitys"
|
|
"ai_scheduler/internal/pkg"
|
|
"ai_scheduler/internal/pkg/l_request"
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"xorm.io/builder"
|
|
)
|
|
|
|
type Dept struct {
|
|
dingDeptImpl *impl.BotDeptImpl
|
|
auth *Auth
|
|
}
|
|
|
|
func NewDept(dingDeptImpl *impl.BotDeptImpl, auth *Auth) *Dept {
|
|
return &Dept{
|
|
dingDeptImpl: dingDeptImpl,
|
|
auth: auth,
|
|
}
|
|
}
|
|
|
|
func (d *Dept) GetDeptInfoByDeptIds(ctx context.Context, deptIds []int, authInfo *AuthInfo) (depts []*entitys.Dept, err error) {
|
|
if len(deptIds) == 0 || authInfo == nil {
|
|
return
|
|
}
|
|
var deptsInfo []model.AiBotDept
|
|
cond := builder.NewCond()
|
|
cond = cond.And(builder.Eq{"dingtalk_dept_id": deptIds})
|
|
err = d.dingDeptImpl.GetRangeToMapStruct(&cond, &deptsInfo)
|
|
if err != nil {
|
|
return
|
|
}
|
|
var existDept = make([]int, len(deptsInfo), 0)
|
|
for _, dept := range deptsInfo {
|
|
depts = append(depts, &entitys.Dept{
|
|
DeptId: int(dept.DeptID),
|
|
Name: dept.Name,
|
|
ToolList: dept.ToolList,
|
|
})
|
|
existDept = append(existDept, int(dept.DeptID))
|
|
}
|
|
diff := pkg.Difference(deptIds, existDept)
|
|
if len(diff) > 0 {
|
|
deptDo := make([]model.AiBotDept, 0)
|
|
for _, deptId := range diff {
|
|
deptInfo, _err := d.GetDeptInfoFromDingTalk(ctx, deptId, authInfo.AccessToken)
|
|
if _err != nil {
|
|
return nil, _err
|
|
}
|
|
depts = append(depts, &entitys.Dept{
|
|
DeptId: deptInfo.DeptId,
|
|
Name: deptInfo.Name,
|
|
})
|
|
deptDo = append(deptDo, model.AiBotDept{
|
|
DingtalkDeptID: int32(deptInfo.DeptId),
|
|
Name: deptInfo.Name,
|
|
})
|
|
}
|
|
if len(deptDo) > 0 {
|
|
_, err = d.dingDeptImpl.Add(deptDo)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (d *Dept) GetDeptInfoFromDingTalk(ctx context.Context, deptId int, token string) (depts DeptResResult, err error) {
|
|
if deptId == 0 || len(token) == 0 {
|
|
return
|
|
}
|
|
|
|
req := l_request.Request{
|
|
Method: http.MethodPost,
|
|
Url: constants.GetDingTalkRequestUrl(constants.RequestUrlGetDeptGet, map[string]string{
|
|
"access_token": token,
|
|
}),
|
|
Json: map[string]interface{}{
|
|
"dept_id": deptId,
|
|
},
|
|
}
|
|
res, _err := req.Send()
|
|
if _err != nil {
|
|
err = _err
|
|
return
|
|
}
|
|
var deptInfo DeptRes
|
|
|
|
err = json.Unmarshal(res.Content, &deptInfo)
|
|
if err != nil {
|
|
return
|
|
}
|
|
if deptInfo.Errcode != 0 {
|
|
fmt.Errorf("钉钉请求报错:%s", deptInfo.Errmsg)
|
|
}
|
|
return deptInfo.DeptResResult, err
|
|
|
|
}
|