mirror of
https://github.com/kongyuebin1/dongfeng-pay.git
synced 2024-12-25 11:32:24 +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("消息应答失败!")
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|