Files
kami_gateway/internal/schema/query/supplier_query.go
2024-09-03 21:52:44 +08:00

113 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package query
import (
"fmt"
"gateway/internal/config"
"gateway/internal/entities/message"
"gateway/internal/entities/supplier/third_party"
"gateway/internal/models/order"
"gateway/internal/models/road"
"gateway/internal/models/supply_model"
"os"
"time"
"github.com/beego/beego/v2/core/logs"
"github.com/go-stomp/stomp/v3"
)
type OrderQueryTask struct {
BankOrderId string
OrderQueryTimer *time.Timer
Times int
}
const (
DelayTime = 5 // 延时时间为5分钟查询一次
LimitTimes = 5 // 最多查询5次
)
func SupplierOrderQueryResult(bankOrderId string) supply_model.MsgModel {
orderInfo := order.GetOrderByBankOrderId(bankOrderId)
if orderInfo.BankOrderId == "" || len(orderInfo.BankOrderId) == 0 {
logs.Error("不存在这样的订单,订单查询结束")
return supply_model.OrderNotExist
}
if orderInfo.Status != "" && orderInfo.Status != "wait" {
logs.Error(fmt.Sprintf("该订单=%s已经处理完毕", bankOrderId))
return supply_model.OrderFinished
}
supplierCode := orderInfo.PayProductCode
supplier_ := third_party.GetPaySupplierByCode(supplierCode)
if supplier_ == nil {
logs.Error("不存在这样的订单,订单查询结束")
return supply_model.OrderNotExist
}
roadInfo := road.GetRoadInfoByRoadUid(orderInfo.RoadUid)
result := supplier_.PayQueryV2(orderInfo, roadInfo)
return result
}
// 该接口是查询上游的订单
func solveSupplierOrderQuery(task OrderQueryTask) {
bankOrderId := task.BankOrderId
flag := SupplierOrderQueryResult(bankOrderId)
if flag == supply_model.RemoteSuccess || flag == supply_model.RemoteDataHealingErr {
logs.Info("订单查询成功, bankOrderId", bankOrderId)
} else {
if task.Times <= LimitTimes {
task.Times += 1
task.OrderQueryTimer = time.NewTimer(time.Duration(5) * time.Minute)
DelayOrderQueryQueue(task)
} else {
logs.Notice(fmt.Sprintf("订单id=%s, 已经查询超过次数", bankOrderId))
}
}
}
// DelayOrderQueryQueue 延时队列
func DelayOrderQueryQueue(task OrderQueryTask) {
for {
select {
case <-task.OrderQueryTimer.C:
logs.Info(fmt.Sprintf("订单id=%s,执行第:%d 次查询", task.BankOrderId, task.Times))
solveSupplierOrderQuery(task)
return
case <-time.After(time.Duration(2*DelayTime) * time.Minute):
return
}
}
}
// CreateSupplierOrderQueryCuConsumer 启动消息订单查询的消息队列消费者
func CreateSupplierOrderQueryCuConsumer() {
conn := message.GetActiveMQConn()
if conn == nil {
logs.Error("supply order query consumer fail")
os.Exit(1)
}
logs.Notice("启动订单查询的消费者成功.....")
orderQuerySub, _ := conn.Subscribe(config.MqOrderQuery, stomp.AckClient)
for {
select {
case v := <-orderQuerySub.C:
if v != nil {
bankOrderId := string(v.Body)
logs.Info("消费者正在处理订单查询: " + bankOrderId)
task := OrderQueryTask{BankOrderId: bankOrderId, OrderQueryTimer: time.NewTimer(time.Second * 1), Times: 1}
DelayOrderQueryQueue(task)
// 应答,重要
err := conn.Ack(v)
if err != nil {
logs.Error("消息应答失败!")
}
}
}
}
}