godingtalk/api_attendance.go

105 lines
5.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Author Kevin Zhu
*
* Direct questions, comments to <ipandtcp@gmail.com>
*/
package godingtalk
import (
"errors"
"time"
)
type Attendance struct {
GmtModifed int64 `json:"gmtModified"` //: 1492594486000,
IsLegal string `json:"isLegal"` //: "N",
BaseCheckTime int64 `json:"baseCheckTime"` //: 1492568460000,
ID int64 `json:"id"` //: 933202551,
UserAddress string `json:"userAddress"` //: "北京市朝阳区崔各庄镇阿里中心.望京A座阿里巴巴绿地中心",
UID string `json:"userId"` //: "manager7078",
CheckType string `json:"checkType"` //: "OnDuty",
TimeResult string `json:"timeResult"` //: "Normal",
DeviceID string `json:"deviceId"` // :"cb7ace07d52fe9be14f4d8bec5e1ba79"
CorpID string `json:"corpId"` //: "ding7536bfee6fb1fa5a35c2f4657eb6378f",
SourceType string `json:"sourceType"` //: "USER",
WorkDate int64 `json:"workDate"` //: 1492531200000,
PlanCheckTime int64 `json:"planCheckTime"` //: 1492568497000,
GmtCreate int64 `json:"gmtCreate"` //: 1492594486000,
LocaltionMethod string `json:"locationMethod"` //: "MAP",
LocationResult string `json:"locationResult"` //: "Outside",
UserLongitude float64 `json:"userLongitude"` //: 116.486888,
PlanID int `json:"planId"` //: 4550269081,
GroupID int `json:"groupId"` //: 121325603,
UserAccuracy int `json:"userAccuracy"` //: 65,
UserCheckTime int64 `json:"userCheckTime"` //: 1492568497000,
UserLatitude float64 `json:"userLatitude"` //: 39.999946,
ProcInstID string `json:"procInstId"` //: "cb992267-9b70"
ApproveID int `json:"approveId"` // string, `json:""`//关联的审批id
ClassId int `json:"classId"` //考勤班次id没有的话表示该次打卡不在排班内
UserSsid string `json:"userSsid"` //用户打卡wifi SSID
UserMacAddr string `json:"userMacAddr"` //用户打卡wifi Mac地址
BaseAddress string `json:"baseAddress"` //基准地址
BaseLongitude float32 `json:"baseLongitude"` // 基准经度
BaseLatitude float32 `json:"baseLatitude"` // 基准纬度
BaseAccuracy int `json:"baseAccuracy"` // 基准定位精度
BaseSsid string `json:"baseSsid"` //基准wifi ssid
BaseMacAddr string `json:"baseMacAddr"` //基准 Mac 地址
OutsideRemark string `json:"outsideRemark"` //打卡备注
}
type listAttendanceRecordResp struct {
OAPIResponse
Records []Attendance `json:"recordresult"`
}
// 获取所有的打卡记录该员工当天如果打卡10条那么10条都将返回
func (c *DingTalkClient) ListAttendanceRecord(ulist []string, dateFrom time.Time, dateTo time.Time) ([]Attendance, error) {
var resp listAttendanceRecordResp
if len(ulist) > 50 || len(ulist) < 1 {
return nil, errors.New("Users can't more than 50 or less than 1")
}
if !dateFrom.Before(dateTo) {
return nil, errors.New("FromDate must before ToDate")
}
if time.Duration(dateTo.UnixNano()-dateFrom.UnixNano()).Hours() > float64(7*24) {
return nil, errors.New("Can't more than 6 days at once")
}
request := map[string]interface{}{
"checkDateFrom": dateFrom.Format("2006-01-02 15:04:05"), // "yyyy-MM-dd hh:mm:ss",
"checkDateTo": dateTo.Format("2006-01-02 15:04:05"), // "yyyy-MM-dd hh:mm:ss",
"userIds": ulist, // 企业内的员工id列表最多不能超过50个
}
return resp.Records, c.httpRPC("/attendance/listRecord", nil, request, &resp)
}
type listAttendanceResultResp struct {
OAPIResponse
HasMore bool `json:"hasMore"`
Records []Attendance `json:"recordresult"`
}
// 即使员工在这期间打了多次,该接口也只会返回两条记录,包括上午的打卡结果和下午的打卡结果
// 用户如果为空则获取所有用户
func (c *DingTalkClient) ListAttendanceResult(ulist []string, dateFrom, dateTo time.Time, offset, lmt int64) (listAttendanceResultResp, error) {
var resp listAttendanceResultResp
if time.Duration(dateTo.UnixNano()-dateFrom.UnixNano()).Hours() > float64(7*24) {
return resp, errors.New("Can't more than 7 days at once")
}
if !dateFrom.Before(dateTo) {
return resp, errors.New("FromDate must before ToDate")
}
request := map[string]interface{}{
"workDateFrom": dateFrom.Format("2006-01-02 15:04:05"), // "yyyy-MM-dd hh:mm:ss",
"workDateTo": dateTo.Format("2006-01-02 15:04:05"), // "yyyy-MM-dd hh:mm:ss",
"userIdList": ulist, // ["员工UserId列表"], 必填与offset和limit配合使用不传表示分页获取全员的数据
"offset": offset, // 必填第一次传0如果还有多余数据下次传之前的offset加上limit的值
"limit": lmt, // 最多50
}
return resp, c.httpRPC("/attendance/list", nil, request, &resp)
}