fix(pool): 添加解绑订单ID逻辑并优化失败处理

- 在SendCardTask接口中新增UnBindPoolOrderId方法实现
- 实现sendCardTaskTypeSendCardTaskBase的UnBindPoolOrderId方法
- 在订单重新入池失败时调用解绑订单ID操作
- OrderPoolServiceImpl新增unboundPoolOrderId方法用于解绑并清理缓存
- 调整SubmitOrder方法中错误处理,增加解绑调用保障数据一致
This commit is contained in:
danial
2025-12-10 22:29:35 +08:00
parent a1db6b764c
commit 09b282fdbb
2 changed files with 14 additions and 0 deletions

View File

@@ -19,6 +19,7 @@ type sendCardTaskType interface {
QueryOrder(ctx context.Context, orderItem OrderPoolItem, task SendCardTask) error
BindOrderFailed(ctx context.Context, orderItem OrderPoolItem, task SendCardTask, msg string) error
BindPoolOrderId(ctx context.Context, orderItem OrderPoolItem, task SendCardTask) error
UnBindPoolOrderId(ctx context.Context, orderItem OrderPoolItem, task SendCardTask) error
GetWaitingTime(ctx context.Context, orderItem OrderPoolItem) int64
}
@@ -143,6 +144,10 @@ func (s *sendCardTaskTypeSendCardTaskBase) BindPoolOrderId(ctx context.Context,
return nil
}
func (s *sendCardTaskTypeSendCardTaskBase) UnBindPoolOrderId(ctx context.Context, orderItem OrderPoolItem, task SendCardTask) error {
order.UpdatePoolOrderId(ctx, task.LocalOrderID, "", "")
return nil
}
func (s *sendCardTaskTypeSendCardTaskBase) GetWaitingTime(ctx context.Context, orderItem OrderPoolItem) int64 {
waitingTime := int64(10)
//随机时间

View File

@@ -521,6 +521,7 @@ func (s *OrderPoolServiceImpl) matchOrdersForFaceValue(ctx context.Context, chan
if strings.Contains(err.Error(), "重新下单提交卡密") {
// 如果绑定失败,将订单重新放回池中
if err = s.redisClient.LPush(ctx, customerKey, task); err != nil {
_ = s.unboundPoolOrderId(ctx, task.SendCardTaskType, produceOrderItem, task)
otelTrace.Logger.WithContext(ctx).Error("用户订单重新入池失败", zap.Error(err))
}
return
@@ -546,6 +547,13 @@ func (s *OrderPoolServiceImpl) GetLocalIdByOrderId(ctx context.Context, orderId
return localId, nil
}
func (s *OrderPoolServiceImpl) unboundPoolOrderId(ctx context.Context, taskEnum card_sender.SendCardTaskEnum, orderItem card_sender.OrderPoolItem, task card_sender.SendCardTask) error {
bindKey := fmt.Sprintf("%s:%s", s.config.OrderBindKey, orderItem.OrderID)
_ = taskEnum.GetSendCardTaskType().UnBindPoolOrderId(ctx, orderItem, task)
_ = s.redisClient.Delete(ctx, bindKey)
return nil
}
func (s *OrderPoolServiceImpl) SubmitOrder(ctx context.Context, task card_sender.SendCardTask) error {
ctx, span := otelTrace.Span(ctx, "SubmitOrder", "OrderPoolServiceImpl.SubmitOrder",
trace.WithAttributes(attribute.String("task", convertor.ToString(task))),
@@ -574,6 +582,7 @@ func (s *OrderPoolServiceImpl) SubmitOrder(ctx context.Context, task card_sender
err = task.SendCardTaskType.GetSendCardTaskType().HandleSendCardTask(ctx, orderItem, task)
if err != nil {
if strings.Contains(err.Error(), "重新下单") {
_ = s.unboundPoolOrderId(ctx, task.SendCardTaskType, orderItem, task)
continue
}
return fmt.Errorf("提交订单失败: %v", err)