参考文档和在线测试接口
实现代码
type UserList struct {
Active bool `json:"active" gorm:"comment:是否激活了钉钉"`
Admin bool `json:"admin" gorm:"comment:是否为企业的管理员"`
Avatar string `json:"avatar" gorm:"comment:头像地址"`
Boss bool `json:"boss" gorm:"comment:是否为企业的老板"`
DeptIDList []int64 `json:"dept_id_list" gorm:"-"`
DeptList []SysDepartment `json:"dept_list" gorm:"many2many:sysDepartment_userLists"`
DeptOrder int64 `json:"dept_order" gorm:"comment:员工在部门中的排序"`
ExclusiveAccount bool `json:"exclusive_account" gorm:"comment:是否专属帐号"`
Extension string `json:"extension" gorm:"comment:扩展属性"`
HideMobile bool `json:"hide_mobile" gorm:"comment:是否号码隐藏"`
Leader bool `json:"leader" gorm:"comment:是否是部门的主管"`
Mobile string `json:"mobile" gorm:"comment:手机号码"`
Name string `json:"name" gorm:"comment:用户姓名"`
StateCode string `json:"state_code" gorm:"comment:国际电话区号"`
Unionid string `json:"unionid" gorm:"comment:用户在当前开发者企业帐号范围内的唯一标识"`
Userid string `json:"userid" gorm:"primaryKey;comment:用户的userId"`
Password string `json:"password" db:"password" gorm:"comment:用户登录密码;default:313233343536e10adc3949ba59abbe56e057f20f883e"` // 密码
}
type SysDepartment struct {
DeptId int `json:"dept_id" gorm:"index;primaryKey"`
Name string `json:"name" gorm:"comment:部门名称"` //例如医学医药类,计算机类,会计类
ParentID uint `json:"parent_id" gorm:"comment:上级部门ID"`
UserList []UserList `gorm:"many2many:sysDepartment_userLists"`
}
func ImportDeptData() (DepartmentList []models.SysDepartment, err error) {
var dfs func(int) (err error)
dfs = func(id int) (err error) {
var client *http.Client
var request *http.Request
var resp *http.Response
var body []byte
URL := "https://oapi.dingtalk.com/topapi/v2/department/listsub?access_token=" + "958d3e9280243f66b989c4dffa81c20a"
client = &http.Client{Transport: &http.Transport{ //对客户端进行一些配置
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
}, Timeout: time.Duration(time.Second * 5)}
//此处是post请求的请求题,我们先初始化一个对象
b := struct {
DeptID int `json:"dept_id"`
}{
DeptID: id,
}
//然后把结构体对象序列化一下
bodymarshal, err := json.Marshal(&b)
if err != nil {
return
}
//再处理一下
reqBody := strings.NewReader(string(bodymarshal))
//然后就可以放入具体的request中的
request, err = http.NewRequest(http.MethodPost, URL, reqBody)
if err != nil {
return
}
resp, err = client.Do(request)
if err != nil {
return
}
defer resp.Body.Close()
body, err = ioutil.ReadAll(resp.Body) //把请求到的body转化成byte[]
if err != nil {
return
}
r := struct {
DingResponseCommon
Result []models.SysDepartment `json:"result"`
}{}
//把请求到的结构反序列化到专门接受返回值的对象上面
err = json.Unmarshal(body, &r)
if err != nil {
return
}
if r.Errcode != 0 {
return errors.New(r.Errmsg)
}
// 此处举行具体的逻辑判断,然后返回即可
subDepartments := r.Result
DepartmentList = append(DepartmentList, subDepartments...)
if len(subDepartments) > 0 {
for i := range subDepartments {
departmentList := make([]models.SysDepartment, 0)
dfs(subDepartments[i].DeptId)
if err != nil {
return
}
DepartmentList = append(DepartmentList, departmentList...)
}
}
return
}
err = dfs(1)
if err != nil {
return
}
db.Debug().Create(DepartmentList)
//用户
UserList := make([]models.UserList, 0)
for i := 0; i < len(DepartmentList); i++ {
//调用钉钉接口,获取部门中的成员,然后存储进来
hasMore := true
for hasMore {
tempUserList := make([]models.UserList, 0)
tempUserList, hasMore, err = GetUserListByDepartmentID(DepartmentList[i].DeptId, 0, 100)
if err != nil {
zap.L().Error("获取部门用户详情失败", zap.Error(err))
if err != nil {
return
}
}
UserList = append(UserList, tempUserList...)
//fmt.Println(i)
//fmt.Println(hasMore)
}
err = db.Model(&DepartmentList[i]).Association("UserList").Replace(UserList)
}
for i := 0; i < len(UserList); i++ {
db.Create(&UserList[i])
}
return
}
func GetUserListByDepartmentID(deptId int, cursor int, size int) (userList []models.UserList, hasMore bool, err error) {
var client *http.Client
var request *http.Request
var resp *http.Response
var body []byte
URL := "https://oapi.dingtalk.com/topapi/v2/user/list?access_token=" + "958d3e9280243f66b989c4dffa81c20a"
client = &http.Client{Transport: &http.Transport{ //对客户端进行一些配置
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
}, Timeout: time.Duration(time.Second * 5)}
//此处是post请求的请求题,我们先初始化一个对象
b := struct {
DeptID int `json:"dept_id"`
Cursor int `json:"cursor"`
Size int `json:"size"`
}{
DeptID: deptId,
Cursor: cursor,
Size: size,
}
//然后把结构体对象序列化一下
bodymarshal, err := json.Marshal(&b)
if err != nil {
return
}
//再处理一下
reqBody := strings.NewReader(string(bodymarshal))
//然后就可以放入具体的request中的
request, err = http.NewRequest(http.MethodPost, URL, reqBody)
if err != nil {
return
}
resp, err = client.Do(request)
if err != nil {
return
}
defer resp.Body.Close()
body, err = ioutil.ReadAll(resp.Body) //把请求到的body转化成byte[]
if err != nil {
return
}
r := struct {
DingResponseCommon
Result struct {
HasMore bool `json:"has_more"`
List []models.UserList `json:"list"`
} `json:"result"`
}{}
//把请求到的结构反序列化到专门接受返回值的对象上面
err = json.Unmarshal(body, &r)
if err != nil {
return
}
if r.Errcode != 0 {
return nil, false, errors.New(r.Errmsg)
}
// 此处举行具体的逻辑判断,然后返回即可
return r.Result.List, r.Result.HasMore, nil
}
导入结果
用户表
部门表