138 lines
3.5 KiB
Go
138 lines
3.5 KiB
Go
|
package service
|
||
|
|
||
|
import (
|
||
|
"enterprise/base/wechat/message"
|
||
|
"enterprise/common/config"
|
||
|
"enterprise/common/dao"
|
||
|
"enterprise/common/model"
|
||
|
"enterprise/common/weixin"
|
||
|
"fmt"
|
||
|
log "github.com/sirupsen/logrus"
|
||
|
"github.com/smbrave/goutil"
|
||
|
"github.com/spf13/cast"
|
||
|
"strings"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
SpStatusCreated = 1
|
||
|
SpStatusPassed = 2
|
||
|
SpStatusRefused = 3
|
||
|
SpStatusCanceled = 4
|
||
|
)
|
||
|
|
||
|
type Approve struct {
|
||
|
approveClient *weixin.QyWeixinApprove
|
||
|
}
|
||
|
|
||
|
func (b *Approve) Reply(msg message.MixMessage) *message.Reply {
|
||
|
cfg := config.GetConfig()
|
||
|
b.approveClient = weixin.NewQyWeixinApprove(cfg.QyWeixin.Corpid, cfg.QyWeixin.ApproveSecret, cfg.QyWeixin.ApproveAgent)
|
||
|
go b.handle(&msg)
|
||
|
return &message.Reply{message.MsgTypeText, message.NewText("")}
|
||
|
}
|
||
|
|
||
|
func (a *Approve) handle(msg *message.MixMessage) {
|
||
|
msgType := msg.MsgType
|
||
|
|
||
|
if msgType == message.MsgTypeEvent {
|
||
|
event := strings.ToUpper(string(msg.Event))
|
||
|
if event == message.EventClick {
|
||
|
a.handleClick(msg)
|
||
|
} else if event == "SYS_APPROVAL_CHANGE" {
|
||
|
a.handleApprovalChange(msg)
|
||
|
}
|
||
|
} else if msgType == message.MsgTypeText {
|
||
|
a.handleText(msg)
|
||
|
}
|
||
|
|
||
|
log.Infof(goutil.EncodeJSONIndent(msg))
|
||
|
}
|
||
|
|
||
|
func (a *Approve) handleApprovalChange(msg *message.MixMessage) {
|
||
|
spStatus := msg.ApprovalInfo.SpStatus
|
||
|
spNo := msg.ApprovalInfo.SpNo
|
||
|
spName := msg.ApprovalInfo.SpName
|
||
|
if spStatus != SpStatusPassed {
|
||
|
//return
|
||
|
}
|
||
|
if spName == "费用报销" {
|
||
|
a.handleRefund(spNo)
|
||
|
} else if spName == "请假" {
|
||
|
a.handleHoliday(spNo)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (a *Approve) handleHoliday(spNo string) {
|
||
|
|
||
|
}
|
||
|
|
||
|
func (a *Approve) handleRefund(spNo string) {
|
||
|
detail, err := a.approveClient.GetDetail(spNo)
|
||
|
if err != nil {
|
||
|
log.Errorf("get spn detail error :%s", err.Error())
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var refund model.ApprovalRefund
|
||
|
refund.Username = detail.Applyer.Userid
|
||
|
refund.SpNo = detail.SpNo
|
||
|
refund.ApplyTime = detail.ApplyTime
|
||
|
refund.Status = model.ApprovalRefundStatusCreated
|
||
|
for _, content := range detail.ApplyData.Contents {
|
||
|
key := content.Title[0].Text
|
||
|
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
|
||
|
}
|
||
|
if key == "报销类型" {
|
||
|
refund.RefundType = value
|
||
|
} else if key == "发生时间" {
|
||
|
refund.RefundDate = time.Unix(cast.ToInt64(value), 0).Format("2006-01-02")
|
||
|
} else if key == "报销费用" {
|
||
|
refund.RefundAmount = cast.ToFloat64(value)
|
||
|
} else if key == "报销说明" {
|
||
|
refund.RefundRemark = value
|
||
|
}
|
||
|
}
|
||
|
if _, err := dao.NewApprovalRefundDao().Create(&refund); err != nil {
|
||
|
log.Errorf("db error :%s", err.Error())
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// 支付费用
|
||
|
var req weixin.RedMoneyReq
|
||
|
req.BillNo = fmt.Sprintf("BX%s", refund.SpNo)
|
||
|
req.Title = fmt.Sprintf("【%s】报销", refund.RefundType)
|
||
|
req.Userid = refund.Username
|
||
|
req.TotalAmount = int64(100 * refund.RefundAmount)
|
||
|
if err := weixin.NewQyPay().PayRedMoney(&req); err != nil {
|
||
|
log.Errorf("pay error :%s", err.Error())
|
||
|
return
|
||
|
}
|
||
|
refund.Status = model.ApprovalRefundStatusPayed
|
||
|
if err := dao.NewApprovalRefundDao().Update(&refund); err != nil {
|
||
|
log.Errorf("db error :%s", err.Error())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (a *Approve) handleText(msg *message.MixMessage) {
|
||
|
|
||
|
}
|
||
|
|
||
|
func (a *Approve) handleClick(msg *message.MixMessage) {
|
||
|
|
||
|
}
|
||
|
|
||
|
func (a *Approve) sendText(message string) {
|
||
|
|
||
|
}
|