package qyweixin import ( "encoding/json" "fmt" log "github.com/sirupsen/logrus" "github.com/smbrave/goutil" "github.com/spf13/cast" "gitlab.batiao8.com/open/gosdk/util" ) type Applyer struct { Userid string `json:"userid"` Partyid string `json:"partyid"` } type Option struct { Key string `json:"key"` Value []struct { Text string `json:"text"` Lang string `json:"lang"` } `json:"value"` } type Selector struct { Type string `json:"type"` Options []*Option `json:"options"` } type Vacation struct { Selector *Selector `json:"selector"` Attendance struct { DateRange struct { NewBegin int64 `json:"new_begin"` NewEnd int64 `json:"new_end"` NewDuration int64 `json:"new_duration"` Type string `json:"type"` } `json:"date_range"` } `json:"attendance"` } type ApplyValue struct { Text string `json:"text"` Selector *Selector `json:"selector"` Children []interface{} `json:"children"` Date struct { Type string `json:"type"` Timestamp string `json:"s_timestamp"` } `json:"date"` NewMoney string `json:"new_Money"` Files []struct { FileId string `json:"file_id"` } `json:"files"` Vacation *Vacation `json:"vacation"` PunchCorrection interface{} `json:"punch_correction"` BankAccount interface{} `json:"bank_account"` } type ApplyContent struct { Control string `json:"control"` Title []struct { Text string `json:"text"` Lang string `json:"lang"` } `json:"title"` Value *ApplyValue `json:"value"` } type ApproveDetail struct { SpNo string `json:"sp_no"` SpName string `json:"sp_name"` SpStatus int `json:"sp_status"` TemplateID string `json:"template_id"` ApplyTime int64 `json:"apply_time"` Applyer *Applyer `json:"applyer"` ApplyData struct { Contents []*ApplyContent `json:"contents"` } `json:"apply_data"` } type ApproveDetailRsp struct { Errcode int `json:"errcode"` Errmsg string `json:"errmsg"` Info *ApproveDetail `json:"info"` } type AppApprove struct { App } func (d *ApproveDetail) GetValue(title string) string { for _, content := range d.ApplyData.Contents { key := content.Title[0].Text if key != title { continue } var value string if content.Control == "Selector" { value = content.Value.Selector.Options[0].Value[0].Text } else if content.Control == "Text" || content.Control == "Textarea" { value = content.Value.Text } else if content.Control == "Date" { value = content.Value.Date.Timestamp } else if content.Control == "Money" { value = content.Value.NewMoney } else if content.Control == "File" { value = content.Value.Files[0].FileId } else if content.Control == "Vacation" { //请假 : 请假类型,开始时间,结束时间,请假时长 tp := content.Value.Vacation.Selector.Options[0].Value[0].Text value = tp + "," + cast.ToString(content.Value.Vacation.Attendance.DateRange.NewBegin) + "," + cast.ToString(content.Value.Vacation.Attendance.DateRange.NewEnd) + "," + cast.ToString(content.Value.Vacation.Attendance.DateRange.NewDuration) } else if content.Control == "PunchCorrection" { //补卡:日期,时间,状态 mp := cast.ToStringMap(content.Value.PunchCorrection) ddate := cast.ToString(mp["daymonthyear"]) dtime := cast.ToString(mp["time"]) if ddate == "" { ddate = dtime } value = ddate + "," + dtime + "," + cast.ToString(mp["state"]) } else if content.Control == "BankAccount" { mp := cast.ToStringMap(content.Value.BankAccount) value = cast.ToString(mp["account_type"]) + "," + cast.ToString(mp["account_name"]) + "," + cast.ToString(mp["account_number"]) } return value } return "" } func (d *ApproveDetail) String() string { return goutil.EncodeJSONIndent(d) } func (d *ApproveDetail) GetUserid() string { return d.Applyer.Userid } func NewAppApprove(cfg *AppConfig) *AppApprove { return &AppApprove{ App: *NewApp(cfg), } } func (q *AppApprove) GetDetail(spNo string) (*ApproveDetail, error) { reqUrl := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail?access_token=%s", q.GetToken()) reqParam := fmt.Sprintf(`{"sp_no":"%s"}`, spNo) rspBody, err := util.HttpPostJson(reqUrl, nil, []byte(reqParam)) if err != nil { return nil, err } var rsp ApproveDetailRsp fmt.Println("spno: %s, detail: %s", spNo, string(rspBody)) if err := json.Unmarshal(rspBody, &rsp); err != nil { log.Errorf("get body[%s] json error :%s", string(rspBody), err.Error()) return nil, err } return rsp.Info, nil } func (q *AppApprove) GetList(start, end int64, templateId string) ([]string, error) { reqUrl := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovalinfo?access_token=%s", q.GetToken()) reqParam := make(map[string]interface{}) reqParam["starttime"] = cast.ToString(start) reqParam["endtime"] = cast.ToString(end) reqParam["new_cursor"] = "" reqParam["size"] = 100 filters := make([]interface{}, 0) if templateId != "" { filters = append(filters, map[string]interface{}{ "key": "template_id", "value": templateId, }) } filters = append(filters, map[string]interface{}{ "key": "sp_status", "value": "2", }) reqParam["filters"] = filters rspBody, err := util.HttpPostJson(reqUrl, nil, []byte(goutil.EncodeJSON(reqParam))) if err != nil { log.Errorf("httpPost error :%s", err.Error()) return nil, err } result, err := q.GetResult(rspBody) if err != nil { return nil, err } return cast.ToStringSlice(result["sp_no_list"]), nil }