96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
package pay
|
|
|
|
import (
|
|
"common/connection"
|
|
"goutil/logUtilPlus"
|
|
"paycenter/internal"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
func init() {
|
|
go CheckOrderStatus()
|
|
}
|
|
|
|
// CheckOrderStatus 查询订单状态
|
|
func CheckOrderStatus() {
|
|
|
|
//捕获异常
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
logUtilPlus.ErrorLog("CheckOrderStatus panic:", err)
|
|
restartConsumer()
|
|
}
|
|
}()
|
|
|
|
for {
|
|
//检索最近一个月的订单
|
|
for i := 0; i < 2; i++ {
|
|
|
|
//取i的负数
|
|
dbDate := connection.GetToMonthAdd(int32(-i))
|
|
var orders []Order // 使用切片存储查询结果
|
|
|
|
//这里使用原始sql
|
|
sql := "select * from order_" + strconv.Itoa(int(dbDate)) + " where order_status = 0"
|
|
dbResult := connection.GetPayDB().Exec(sql).Find(&orders)
|
|
if dbResult.Error != nil {
|
|
logUtilPlus.ErrorLog("查询订单状态失败", dbResult.Error.Error())
|
|
continue
|
|
}
|
|
|
|
// 处理查询结果
|
|
for _, order := range orders {
|
|
|
|
//查询订单状态
|
|
statusStr, err := internal.QueryOrderByOutTradeNo(order.OrderID)
|
|
if err != nil {
|
|
logUtilPlus.ErrorLog("查询订单状态失败", err.Error())
|
|
continue
|
|
}
|
|
if statusStr == "SUCCESS" {
|
|
//修改订单状态
|
|
err = ChangeOrderStatus(order.OrderID, 1)
|
|
if err != nil {
|
|
logUtilPlus.ErrorLog("修改订单状态失败", err.Error())
|
|
continue
|
|
}
|
|
} else if statusStr == "CLOSED" { //已关闭
|
|
order.OrderStatus = 2
|
|
//修改订单状态
|
|
connection.AsyncSave(connection.GetPayDB(), &order)
|
|
} else if order.OrderTime.Add(time.Hour * 1).Before(time.Now()) { //超一个小时未支付 直接关闭订单
|
|
//直接关闭订单
|
|
internal.CloseOrder(order.OrderID)
|
|
order.OrderStatus = 2
|
|
connection.AsyncSave(connection.GetPayDB(), &order)
|
|
}
|
|
}
|
|
}
|
|
|
|
//休息30分钟
|
|
time.Sleep(time.Minute * 30)
|
|
}
|
|
}
|
|
|
|
// restartConsumer 重启消费者
|
|
func restartConsumer() {
|
|
// 设置重试次数
|
|
maxRetries := 5
|
|
retryCount := 0
|
|
|
|
for {
|
|
select {
|
|
case <-time.After(5 * time.Second): // 等待5秒后重试
|
|
if retryCount >= maxRetries {
|
|
logUtilPlus.ErrorLog("查询订单状态,达到最大重试次数")
|
|
return
|
|
}
|
|
logUtilPlus.InfoLog("查询订单状态,重试次数: %d", retryCount+1)
|
|
go CheckOrderStatus()
|
|
return
|
|
}
|
|
retryCount++
|
|
}
|
|
}
|