fix(pool): 添加解绑订单ID逻辑并优化失败处理
- 在SendCardTask接口中新增UnBindPoolOrderId方法实现 - 实现sendCardTaskTypeSendCardTaskBase的UnBindPoolOrderId方法 - 在订单重新入池失败时调用解绑订单ID操作 - OrderPoolServiceImpl新增unboundPoolOrderId方法用于解绑并清理缓存 - 调整SubmitOrder方法中错误处理,增加解绑调用保障数据一致
This commit is contained in:
@@ -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)
|
||||
//随机时间
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user