package weixin import ( "encoding/json" butil "enterprise/base/util" "fmt" log "github.com/sirupsen/logrus" "github.com/smbrave/goutil" "github.com/spf13/cast" ) 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"` } 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 QyWeixinApprove struct { QyWeixin } 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 duration := cast.ToString(content.Value.Vacation.Attendance.DateRange.NewDuration) value = tp + "," + duration } return value } return "" } func (d *ApproveDetail) GetUserid() string { return d.Applyer.Userid } func NewQyWeixinApprove(corpId, secret, agent string) *QyWeixinApprove { return &QyWeixinApprove{ QyWeixin: QyWeixin{ CorpId: corpId, Secret: secret, Agent: agent, }, } } func (q *QyWeixinApprove) 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 := butil.HttpPostJson(reqUrl, nil, []byte(reqParam)) if err != nil { return nil, err } var rsp ApproveDetailRsp 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 *QyWeixinApprove) 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 := butil.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 }