mirror of
https://github.com/kongyuebin1/dongfeng-pay.git
synced 2024-11-11 04:59:21 +08:00
138 lines
3.5 KiB
Go
138 lines
3.5 KiB
Go
|
/***************************************************
|
|||
|
** @Desc : 处理代付查询功能
|
|||
|
** @Time : 2019/12/3 15:07
|
|||
|
** @Author : yuebin
|
|||
|
** @File : pay_for_query
|
|||
|
** @Last Modified by : yuebin
|
|||
|
** @Last Modified time: 2019/12/3 15:07
|
|||
|
** @Software: GoLand
|
|||
|
****************************************************/
|
|||
|
package query
|
|||
|
|
|||
|
import (
|
|||
|
"fmt"
|
|||
|
"gateway/conf"
|
|||
|
"gateway/message"
|
|||
|
"gateway/models/payfor"
|
|||
|
"gateway/models/road"
|
|||
|
"gateway/pay_for"
|
|||
|
"gateway/supplier/third_party"
|
|||
|
"gateway/utils"
|
|||
|
"github.com/beego/beego/v2/core/logs"
|
|||
|
"github.com/go-stomp/stomp"
|
|||
|
"os"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
type PayForQueryTask struct {
|
|||
|
Delay *time.Timer
|
|||
|
MerchantOrderId string
|
|||
|
BankOrderId string
|
|||
|
FirstNotifyTime string
|
|||
|
QueryTimes int
|
|||
|
LimitTimes int
|
|||
|
Status string
|
|||
|
}
|
|||
|
|
|||
|
const (
|
|||
|
PayForLimitTimes = 12 //最多查询次数
|
|||
|
PayForQueryInterval = 5 //时间间隔为5分钟
|
|||
|
)
|
|||
|
|
|||
|
func PayForQueryTimer(task PayForQueryTask) {
|
|||
|
for {
|
|||
|
select {
|
|||
|
case <-task.Delay.C:
|
|||
|
PayForSupplier(task)
|
|||
|
task.Delay.Stop()
|
|||
|
return
|
|||
|
//70分钟没有执行该协程,那么退出协程
|
|||
|
case <-time.After(time.Minute * 70):
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func PayForSupplier(task PayForQueryTask) {
|
|||
|
logs.Info(fmt.Sprintf("执行代付查询任务:%+v", task))
|
|||
|
payFor := payfor.GetPayForByBankOrderId(task.BankOrderId)
|
|||
|
roadInfo := road.GetRoadInfoByRoadUid(payFor.RoadUid)
|
|||
|
supplier := third_party.GetPaySupplierByCode(roadInfo.ProductUid)
|
|||
|
if supplier == nil {
|
|||
|
logs.Error("代付查询返回supplier为空")
|
|||
|
return
|
|||
|
}
|
|||
|
res, _ := supplier.PayForQuery(payFor)
|
|||
|
if res == conf.PAYFOR_SUCCESS {
|
|||
|
//代付成功了
|
|||
|
pay_for.PayForSuccess(payFor)
|
|||
|
} else if res == conf.PAYFOR_FAIL {
|
|||
|
//代付失败
|
|||
|
pay_for.PayForFail(payFor)
|
|||
|
} else if res == conf.PAYFOR_BANKING {
|
|||
|
//银行处理中,那么就继续执行查询,直到次数超过最大次数
|
|||
|
if task.QueryTimes <= task.LimitTimes {
|
|||
|
task.QueryTimes += 1
|
|||
|
task.Delay = time.NewTimer(time.Duration(PayForQueryInterval) * time.Minute)
|
|||
|
go PayForQueryTimer(task)
|
|||
|
} else {
|
|||
|
logs.Info(fmt.Sprintf("该代付订单已经超过最大查询次数,bankOrderId = %s", task.BankOrderId))
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func payForQueryConsumer(bankOrderId string) {
|
|||
|
exist := payfor.IsExistPayForByBankOrderId(bankOrderId)
|
|||
|
if !exist {
|
|||
|
logs.Error(fmt.Sprintf("代付记录不存在,bankOrderId = %s", bankOrderId))
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
payFor := payfor.GetPayForByBankOrderId(bankOrderId)
|
|||
|
|
|||
|
if payFor.Status != conf.PAYFOR_BANKING {
|
|||
|
logs.Info(fmt.Sprintf("代付状态不是银行处理中,不需要去查询,bankOrderId = %s", bankOrderId))
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
payForQueryTask := PayForQueryTask{Delay: time.NewTimer(time.Duration(PayForQueryInterval) * time.Minute), MerchantOrderId: payFor.MerchantOrderId,
|
|||
|
BankOrderId: payFor.BankOrderId, FirstNotifyTime: utils.GetBasicDateTime(), QueryTimes: 1, LimitTimes: PayForLimitTimes, Status: payFor.Status}
|
|||
|
|
|||
|
go PayForQueryTimer(payForQueryTask)
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* 创建代付查询的消费者
|
|||
|
*/
|
|||
|
func CreatePayForQueryConsumer() {
|
|||
|
//启动定时任务
|
|||
|
conn := message.GetActiveMQConn()
|
|||
|
if conn == nil {
|
|||
|
logs.Error("启动消息队列消费者失败....")
|
|||
|
os.Exit(1)
|
|||
|
}
|
|||
|
|
|||
|
logs.Notice("代付查询消费启动成功......")
|
|||
|
|
|||
|
payForQuery, err := conn.Subscribe(conf.MQ_PAYFOR_QUERY, stomp.AckClient)
|
|||
|
if err != nil {
|
|||
|
logs.Error("订阅代付查询失败......")
|
|||
|
os.Exit(1)
|
|||
|
}
|
|||
|
|
|||
|
for {
|
|||
|
select {
|
|||
|
case v := <-payForQuery.C:
|
|||
|
if v != nil {
|
|||
|
bankOrderId := string(v.Body)
|
|||
|
go payForQueryConsumer(bankOrderId)
|
|||
|
//应答,重要
|
|||
|
err := conn.Ack(v)
|
|||
|
if err != nil {
|
|||
|
logs.Error("消息应答失败!")
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|