gosdk/qyweixin/app_hr.go

174 lines
4.8 KiB
Go

package qyweixin
import (
"fmt"
"git.u8t.cn/open/gosdk/util"
log "github.com/sirupsen/logrus"
"github.com/smbrave/goutil"
"github.com/spf13/cast"
"time"
)
var (
urlQyWeixinHrGetAllField = "https://qyapi.weixin.qq.com/cgi-bin/hr/get_fields"
urlQyWeixinHrGetStaffInfo = "https://qyapi.weixin.qq.com/cgi-bin/hr/get_staff_info"
urlQyWeixinHrGetDepartment = "https://qyapi.weixin.qq.com/cgi-bin/department/list"
urlQyWeixinHrGetDepartmentUser = "https://qyapi.weixin.qq.com/cgi-bin/user/list"
)
type AppHr struct {
App
config *AppConfig
}
type Department struct {
Id int64 `json:"id"`
Pid int64 `json:"pid"`
Name string `json:"name"`
Leader []string `json:"leader"`
}
type StaffInfo struct {
UserName string
RealName string
Extra map[string]string
Phone string
StaffType string
Idno string
EntryDate string
BirthDate string
OfficialDate string
BankName string
BankCard string
}
func NewAppHr(cfg *AppConfig) *AppHr {
return &AppHr{
App: *NewApp(cfg),
}
}
func (h *AppHr) GetStaffInfo(userId string) (*StaffInfo, error) {
reqUrl := fmt.Sprintf("%s?access_token=%s", urlQyWeixinHrGetStaffInfo, h.GetToken())
reqBody := make(map[string]interface{})
reqBody["userid"] = userId
reqBody["get_all"] = true
rspBody, err := util.HttpPostJson(reqUrl, nil, []byte(goutil.EncodeJSON(reqBody)))
if err != nil {
return nil, err
}
staff := new(StaffInfo)
result, err := h.GetResult(rspBody)
if err != nil {
return nil, err
}
fieldMap := make(map[string]map[string]interface{})
for _, fieldInfo := range cast.ToSlice(result["field_info"]) {
fi := cast.ToStringMap(fieldInfo)
fieldMap[cast.ToString(fi["fieldid"])] = fi
}
userInfo, err := h.GetUserInfo(userId)
if err != nil {
log.Errorf("GetUserInfo error:%s", err.Error())
return nil, err
}
staff.Extra = make(map[string]string)
for k, v := range fieldMap {
staff.Extra[k] = h.getFieldValue(v)
}
staff.UserName = userId
staff.RealName = userInfo.RealName
staff.Phone = cast.ToString(h.getFieldValue(fieldMap["17003"]))
staff.StaffType = cast.ToString(h.getFieldValue(fieldMap["12003"]))
staff.Idno = cast.ToString(h.getFieldValue(fieldMap["11015"]))
staff.BankName = cast.ToString(h.getFieldValue(fieldMap["13001"]))
staff.BankCard = cast.ToString(h.getFieldValue(fieldMap["13002"]))
staff.EntryDate = time.Unix(cast.ToInt64(h.getFieldValue(fieldMap["12018"])), 0).Format("2006-01-02")
staff.BirthDate = time.Unix(cast.ToInt64(h.getFieldValue(fieldMap["11005"])), 0).Format("2006-01-02")
staff.OfficialDate = time.Unix(cast.ToInt64(h.getFieldValue(fieldMap["12023"])), 0).Format("2006-01-02")
return staff, nil
}
func (h *AppHr) GetDepartment(id int64) ([]*Department, error) {
reqUrl := fmt.Sprintf("%s?access_token=%s&id=%d", urlQyWeixinHrGetDepartment, h.GetToken(), id)
rspBody, err := util.HttpGet(reqUrl, nil)
if err != nil {
return nil, err
}
resp, err := h.GetResult(rspBody)
if err != nil {
return nil, err
}
result := make([]*Department, 0)
departments := cast.ToSlice(resp["department"])
for _, dd := range departments {
d := cast.ToStringMap(dd)
r := new(Department)
r.Name = cast.ToString(d["name"])
r.Leader = cast.ToStringSlice(d["department_leader"])
r.Id = cast.ToInt64(d["id"])
r.Pid = cast.ToInt64(d["parentid"])
result = append(result, r)
}
return result, nil
}
func (h *AppHr) GetDepartmentUserId(id int64) ([]string, error) {
reqUrl := fmt.Sprintf("%s?access_token=%s&department_id=%d", urlQyWeixinHrGetDepartmentUser, h.GetToken(), id)
rspBody, err := util.HttpGet(reqUrl, nil)
if err != nil {
return nil, err
}
resp, err := h.GetResult(rspBody)
if err != nil {
return nil, err
}
result := make([]string, 0)
userlist := cast.ToSlice(resp["userlist"])
for _, dd := range userlist {
d := cast.ToStringMap(dd)
result = append(result, cast.ToString(d["userid"]))
}
return result, nil
}
func (h *AppHr) getFieldValue(fieldInfo map[string]interface{}) string {
valueType := cast.ToInt(fieldInfo["value_type"])
if valueType == 1 {
return cast.ToString(fieldInfo["value_string"])
} else if valueType == 2 {
return cast.ToString(fieldInfo["value_uint64"])
} else if valueType == 3 {
return cast.ToString(fieldInfo["value_uint32"])
} else if valueType == 4 {
return cast.ToString(fieldInfo["value_int64"])
} else if valueType == 5 {
moble := cast.ToStringMap(fieldInfo["value_mobile"])
return cast.ToString(moble["value_mobile"])
}
return ""
}
func (h *AppHr) GetAllField() ([]byte, error) {
reqUrl := fmt.Sprintf("%s?access_token=%s", urlQyWeixinHrGetAllField, h.GetToken())
rspBody, err := util.HttpGet(reqUrl, nil)
if err != nil {
return nil, err
}
result, err := h.GetResult(rspBody)
if err != nil {
return nil, err
}
fmt.Println(goutil.EncodeJSONIndent(result))
return rspBody, err
}