244 lines
7.2 KiB
Go
244 lines
7.2 KiB
Go
package weixin
|
||
|
||
import (
|
||
"encoding/json"
|
||
butil "enterprise/base/util"
|
||
"enterprise/common/model"
|
||
"fmt"
|
||
log "github.com/sirupsen/logrus"
|
||
"github.com/smbrave/goutil"
|
||
"github.com/spf13/cast"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
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"`
|
||
}
|
||
|
||
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
|
||
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"])
|
||
}
|
||
return value
|
||
}
|
||
return ""
|
||
}
|
||
|
||
func (d *ApproveDetail) String() string {
|
||
return goutil.EncodeJSONIndent(d)
|
||
}
|
||
|
||
func (d *ApproveDetail) GetUserid() string {
|
||
return d.Applyer.Userid
|
||
}
|
||
|
||
func (d *ApproveDetail) ToVacation() *model.ApprovalVacation {
|
||
vacation := new(model.ApprovalVacation)
|
||
vacation.SpNo = d.SpNo
|
||
vacation.Username = d.GetUserid()
|
||
vacation.ApplyTime = goutil.TimeToDateTime(d.ApplyTime)
|
||
|
||
fields := strings.SplitN(d.GetValue("请假类型"), ",", 4)
|
||
dTime := cast.ToInt64(fields[1])
|
||
vacation.VacationType = fields[0]
|
||
vacation.VacationDate = goutil.TimeToDate(dTime)
|
||
vacation.VacationStartTime = goutil.TimeToDateTime(cast.ToInt64(fields[1]))
|
||
vacation.VacationEndTime = goutil.TimeToDateTime(cast.ToInt64(fields[2]))
|
||
vacation.VacationDuration = float64(cast.ToInt64(fields[3])) / float64(3600*8)
|
||
vacation.VacationRemark = d.GetValue("请假事由")
|
||
vacation.Month = time.Unix(dTime, 0).Format("200601")
|
||
return vacation
|
||
}
|
||
|
||
func (d *ApproveDetail) ToRefund() *model.ApprovalRefund {
|
||
refund := new(model.ApprovalRefund)
|
||
refund.SpNo = d.SpNo
|
||
refund.Username = d.GetUserid()
|
||
refund.ApplyTime = goutil.TimeToDateTime(d.ApplyTime)
|
||
refund.Status = model.ApprovalRefundStatusCreated
|
||
refund.RefundType = d.GetValue("报销类型")
|
||
refundTime := cast.ToInt64(d.GetValue("发生时间"))
|
||
refund.Month = time.Unix(refundTime, 0).Format("200601")
|
||
refund.RefundDate = goutil.TimeToDateTime(refundTime)
|
||
refund.RefundAmount = cast.ToFloat64(d.GetValue("报销费用"))
|
||
refund.RefundRemark = d.GetValue("报销说明")
|
||
return refund
|
||
}
|
||
|
||
func (d *ApproveDetail) ToCheckin() *model.ApprovalCheckin {
|
||
ac := new(model.ApprovalCheckin)
|
||
value := strings.SplitN(d.GetValue("补卡"), ",", 3)
|
||
ac.SpNo = d.SpNo
|
||
ac.Username = d.GetUserid()
|
||
ac.ApplyTime = goutil.TimeToDateTime(d.ApplyTime)
|
||
ac.CheckinRemark = d.GetValue("补卡事由")
|
||
ac.CheckinDate = goutil.TimeToDate(cast.ToInt64(value[0]))
|
||
ac.Month = time.Unix(cast.ToInt64(value[0]), 0).Format("200601")
|
||
ac.CheckinTime = goutil.TimeToDateTime(cast.ToInt64(value[1]))
|
||
ac.CheckinType = value[2]
|
||
return ac
|
||
}
|
||
|
||
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
|
||
|
||
mp := make(map[string]interface{})
|
||
json.Unmarshal(rspBody, &mp)
|
||
//fmt.Println(goutil.EncodeJSONIndent(mp))
|
||
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
|
||
}
|