From d64c8ea43564822493a5657750dff1f20df1f08b Mon Sep 17 00:00:00 2001 From: ziming Date: Mon, 17 Nov 2025 09:38:16 +0800 Subject: [PATCH] voucher --- internal/biz/used_notify.go | 66 ++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/internal/biz/used_notify.go b/internal/biz/used_notify.go index 1293b7b..8c79485 100644 --- a/internal/biz/used_notify.go +++ b/internal/biz/used_notify.go @@ -6,6 +6,8 @@ import ( "fmt" "github.com/go-kratos/kratos/v2/log" "github.com/go-kratos/kratos/v2/transport/http" + "golang.org/x/sync/errgroup" + "runtime" "voucher/internal/biz/bo" "voucher/internal/biz/do" ) @@ -44,33 +46,59 @@ func (this *VoucherBiz) UsedNotify(ctx context.Context, msg string) error { errNum := 0 - return this.OrderRepo.FinUsedInBatches(ctx, req, func(ctx context.Context, rows []*bo.OrderBo) error { + eg := new(errgroup.Group) + eg.SetLimit(3) + + err := this.OrderRepo.FinUsedInBatches(ctx, req, func(ctx context.Context, rows []*bo.OrderBo) error { for _, order := range rows { - event, err := order.Status.GetOrderNotifyEvent() - if err != nil { - return err - } + eg.Go(func() error { - notify := &bo.OrderNotifyBo{ - OrderNo: order.OrderNo, - NotifyUrl: order.NotifyUrl, - Channel: order.Channel, - Event: event, - Type: order.Type, - } - - if err = this.request(ctx, order, notify); err != nil { - errNum++ - if errNum > 50 { - return fmt.Errorf("核销重试通知处理,通知失败次数超过50次,请检查:%v", err) + if err := this.usedNotify(ctx, order); err != nil { + errNum++ + if errNum > 50 { + return fmt.Errorf("核销重试通知处理,通知失败次数超过50次,请检查:%v", err) + } + log.Warnf("核销重试通知处理,通知失败:%v", err) } - log.Warnf("核销重试通知处理,通知失败:%v", err) - } + + return nil + }) } return nil }) + + if err != nil { + return err + } + + return eg.Wait() // 仅返回第一个错误 +} + +func (this *VoucherBiz) usedNotify(ctx context.Context, order *bo.OrderBo) error { + + defer func() { + if err := recover(); err != nil { + _, file, line, _ := runtime.Caller(1) // 1 表示获取当前调用者的调用信息 + log.Errorf("核销重试通知处理,发生错误:req:%s,err:%v,file:%s,line:%d", order.OrderNo, err, file, line) + } + }() + + event, err := order.Status.GetOrderNotifyEvent() + if err != nil { + return err + } + + notify := &bo.OrderNotifyBo{ + OrderNo: order.OrderNo, + NotifyUrl: order.NotifyUrl, + Channel: order.Channel, + Event: event, + Type: order.Type, + } + + return this.request(ctx, order, notify) }