Files
kami_gateway/internal/schema/query/supplier_query.go
danial e88ff05a14 refactor(trace): 重命名 otel 包为 otelTrace并更新相关引用
- 将内部使用的 otel 包重命名为 otelTrace
- 更新了所有引用该包的文件中的导入路径
- 修改了部分函数和变量名称以适应新的包名
2025-02-23 21:56:29 +08:00

118 lines
3.6 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 (
"context"
"fmt"
"gateway/internal/config"
"gateway/internal/models/order"
"gateway/internal/models/road"
"gateway/internal/models/supply_model"
"gateway/internal/otelTrace"
"gateway/internal/service/message"
"gateway/internal/service/supplier/third_party"
"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(ctx context.Context, bankOrderId string) supply_model.MsgModel {
orderInfo := order.GetOrderByBankOrderId(ctx, bankOrderId)
if orderInfo.BankOrderId == "" || len(orderInfo.BankOrderId) == 0 {
otelTrace.Logger.WithContext(ctx).Error("不存在这样的订单,订单查询结束")
return supply_model.OrderNotExist
}
if orderInfo.Status != "" && orderInfo.Status != "wait" {
otelTrace.Logger.WithContext(ctx).Error(fmt.Sprintf("该订单=%s已经处理完毕", bankOrderId))
return supply_model.OrderFinished
}
supplierCode := orderInfo.PayProductCode
supplier_ := third_party.GetPaySupplierByCode(supplierCode)
if supplier_ == nil {
otelTrace.Logger.WithContext(ctx).Error("不存在这样的订单,订单查询结束")
return supply_model.OrderNotExist
}
roadInfo := road.GetRoadInfoByRoadUid(ctx, orderInfo.RoadUid)
result := supplier_.PayQueryV2(orderInfo, roadInfo)
return result
}
// 该接口是查询上游的订单
func solveSupplierOrderQuery(ctx context.Context, task OrderQueryTask) {
bankOrderId := task.BankOrderId
flag := SupplierOrderQueryResult(ctx, bankOrderId)
if flag == supply_model.RemoteSuccess || flag == supply_model.RemoteDataHealingErr {
otelTrace.Logger.WithContext(ctx).Info(fmt.Sprintf("订单查询成功, bankOrderId%s", bankOrderId))
} else {
if task.Times <= LimitTimes {
task.Times += 1
task.OrderQueryTimer = time.NewTimer(time.Duration(5) * time.Minute)
DelayOrderQueryQueue(ctx, task)
} else {
logs.Notice(fmt.Sprintf("订单id=%s, 已经查询超过次数", bankOrderId))
}
}
}
// DelayOrderQueryQueue 延时队列
func DelayOrderQueryQueue(ctx context.Context, task OrderQueryTask) {
for {
select {
case <-task.OrderQueryTimer.C:
otelTrace.Logger.WithContext(ctx).Info(fmt.Sprintf("订单id=%s,执行第:%d 次查询", task.BankOrderId, task.Times))
solveSupplierOrderQuery(ctx, task)
return
case <-time.After(time.Duration(2*DelayTime) * time.Minute):
return
}
}
}
// CreateSupplierOrderQueryCuConsumer 启动消息订单查询的消息队列消费者
func CreateSupplierOrderQueryCuConsumer(ctx context.Context) {
ctx, cancel := otelTrace.Span(ctx, "CreateSupplierOrderQueryCuConsumer", "CreateSupplierOrderQueryCuConsumer")
defer cancel()
conn := message.GetActiveMQConn()
if conn == nil {
otelTrace.Logger.WithContext(ctx).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)
otelTrace.Logger.WithContext(ctx).Info("消费者正在处理订单查询: " + bankOrderId)
task := OrderQueryTask{BankOrderId: bankOrderId, OrderQueryTimer: time.NewTimer(time.Second * 1), Times: 1}
DelayOrderQueryQueue(ctx, task)
// 应答,重要
err := conn.Ack(v)
if err != nil {
otelTrace.Logger.WithContext(ctx).Error("消息应答失败!")
}
}
}
}
}