Files
zt-closet-backend/internal/service/order_expire.go
T
2026-09-16 00:23:49 +08:00

49 lines
1.3 KiB
Go

package service
import (
"context"
"log/slog"
"time"
"git.lzcwy.cn/zhengchiliu/zt-closet-backend/global"
"git.lzcwy.cn/zhengchiliu/zt-closet-backend/internal/mysqldao"
)
// StartOrderExpireScheduler 启动订单超时过期定时任务:每分钟将超时未支付订单批量置为已过期。
func StartOrderExpireScheduler() {
go func() {
slog.Info("order expire scheduler started")
for {
func() {
defer func() {
if r := recover(); r != nil {
slog.Error("order expire scheduler panic", "recover", r)
}
}()
runOrderExpire()
}()
time.Sleep(time.Minute)
}
}()
}
// runOrderExpire 扫描并过期超时待支付订单。条件更新天然幂等,多实例并发无害,无需分布式锁。
func runOrderExpire() {
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
ctx, span := global.Tracer.Start(ctx, "scheduler.OrderExpire")
defer span.End()
affected, err := mysqldao.NewOrderDao().OrderExpireByTime(ctx, nowUnix())
if err != nil {
slog.ErrorContext(ctx, "expire orders failed", "error", err)
return
}
if affected > 0 {
slog.InfoContext(ctx, "expired pending orders", "count", affected)
} else {
slog.DebugContext(ctx, "order expire: no pending orders expired")
}
}