钉钉实现企业内部用户部门和个人信息导入数据库

参考文档和在线测试接口

获取部门列表

在线测试

查看部门用户完成信息

实现代码

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
}

导入结果

用户表
钉钉实现企业内部用户部门和个人信息导入数据库_第1张图片
部门表
在这里插入图片描述

你可能感兴趣的:(数据库,钉钉,windows)