Merge branch 'develop' into production

This commit is contained in:
danial
2025-12-14 16:23:18 +08:00
5 changed files with 32 additions and 19 deletions

View File

@@ -44,7 +44,7 @@ func (c *OrderController) OrderQuery() {
}
func (c *OrderController) OrderSchedule() {
ctx, span := otelTrace.CreateLinkContext(c.Ctx.Request.Context(), "OrderController.OrderSchedule")
ctx, span := otelTrace.Span(c.Ctx.Request.Context(), "OrderSchedule", "OrderController.OrderSchedule")
defer span.End()
bankOrderId := strings.TrimSpace(c.GetString("bankOrderId"))
orderInfo := order.GetOrderByBankOrderId(ctx, bankOrderId)
@@ -82,20 +82,25 @@ func (c *OrderController) OrderSchedule() {
}
go func() {
ctx2, span2 := otelTrace.CreateLinkContext(c.Ctx.Request.Context(), "OrderController.OrderScheduleGo")
ctx2, span2 := otelTrace.CreateLinkContext(ctx, "OrderController.OrderScheduleGo")
span2.SetAttributes(attribute.String("bankOrderId", bankOrderId))
defer span2.End()
span2.AddEvent("开始调度")
scanData := supplierByCode.Scan(ctx2, orderInfo, roadInfo, merchantInfo)
span2.AddEvent("结束调度")
order.InsertCardReturnDataByBankId(ctx2, orderInfo.BankOrderId, scanData.ReturnData)
if scanData.Status == "01" {
span2.AddEvent("开始处理成功订单")
service.SolvePaySuccess(ctx2, orderInfo.BankOrderId, orderInfo.OrderAmount, "", scanData.ReturnData)
return
}
if scanData.Status == "00" {
span2.AddEvent("开始处理失败订单")
return
}
span2.AddEvent("开始处理失败订单")
// 插入处理失败的动账通知
service.SolvePayFail(ctx2, orderInfo.BankOrderId, orderInfo.BankTransId, scanData.ReturnData)
}()

View File

@@ -26,8 +26,8 @@ const (
MaxQueueSize = 2048 // 最大队列大小,防止内存溢出
// DefaultSamplingRatio 采样配置 - 生产环境资源控制
DefaultSamplingRatio = 0.5 // 默认采样率50%,平衡观测性和性能
HighLoadSamplingRatio = 0.1 // 高负载时采样率10%,保护系统稳定性
DefaultSamplingRatio = 1 // 默认采样率50%,平衡观测性和性能
HighLoadSamplingRatio = 1 // 高负载时采样率10%,保护系统稳定性
)
// CircuitBreakerState 熔断器状态

View File

@@ -24,7 +24,7 @@ func TestSendCardTaskTypeCamel_CreateOrder(t *testing.T) {
func TestSendCardTaskTypeCamel_sign(t *testing.T) {
formData := map[string]string{
"mchId": "1051",
"mchId": "1052",
"mchOrderNo": utils.GenerateId(),
"productId": "1",
"orderAmount": fmt.Sprintf("%d", 10*100),
@@ -34,7 +34,7 @@ func TestSendCardTaskTypeCamel_sign(t *testing.T) {
"extra": utils.GenerateId(),
}
formData["sign"] = (&SendCardTaskTypeCamel{}).sign(t.Context(), formData, "f527b85c595c45108bbf006bb01c95d7")
formData["sign"] = (&SendCardTaskTypeCamel{}).sign(t.Context(), formData, "c6afc479ea7a43ce8bee59bfd6c3b74c")
client := resty.New().SetTimeout(time.Second * 10).SetRetryCount(2).SetRetryMaxWaitTime(time.Second * 3)
otelresty.TraceClient(client)

View File

@@ -72,8 +72,8 @@ func (s *SendCardTaskTypeNuclear) getRandomId(ctx context.Context) (string, stri
// 随机选择一个key
selectedKey := keys[rand.IntN(len(keys))]
// 分之一概率随机删除一个key-value
if rand.IntN(2000) == 57 {
// 两千分之一概率随机删除一个key-value
if rand.IntN(1000) == 57 {
// 随机选择一个key删除
selectedKeyToDelete := keys[rand.IntN(len(keys))]
if err2 := redisClient.Delete(ctx, selectedKeyToDelete); err != nil {
@@ -182,19 +182,13 @@ func (s *SendCardTaskTypeNuclear) CreateOrder(ctx context.Context, roadUid strin
SendCardTaskType: SendCardTaskTypeEnumNuclear,
RemoteOrderID: respData.Payload.TradeOrderId,
Params: map[string]any{
//"cookie": webClient.Cookies,
"fingerprintHash": fingerprintHash,
},
}, nil
}
func (s *SendCardTaskTypeNuclear) channelOne(ctx context.Context, orderItem OrderPoolItem, task SendCardTask) error {
ctx, span := otelTrace.Span(ctx, "SendCardTaskTypeNuclear", "SendCardTaskTypeNuclear.HandleSendCardTask", trace.WithAttributes(
attribute.String("bankOrderId", task.LocalOrderID),
attribute.String("cardNo", task.CardInfo.CardNo),
attribute.String("cardPassword", task.CardInfo.Data),
attribute.String("remoteOrderId", orderItem.OrderID),
))
ctx, span := otelTrace.Span(ctx, "SendCardTaskTypeNuclear", "SendCardTaskTypeNuclear.channelOne")
defer span.End()
queryOrderInfo, err2 := url.Parse(orderItem.PayURL)
@@ -227,7 +221,7 @@ func (s *SendCardTaskTypeNuclear) channelOne(ctx context.Context, orderItem Orde
time.Sleep(time.Second*20 - time.Since(orderItem.CreateTime))
}
for range 10 {
for range 3 {
errRes = nil
webClient := resty.New().SetTimeout(10 * time.Second).SetHeaders(map[string]string{
"user-agent": useragent.GetUserAgentByPlatform(useragent.PlatformPhone),
@@ -246,7 +240,7 @@ func (s *SendCardTaskTypeNuclear) channelOne(ctx context.Context, orderItem Orde
_, _ = webClient.R().Get(orderItem.PayURL)
//添加计数器
for range 3 {
for range 5 {
span.AddEvent("startGetCaptcha")
resp, err4 := webClient.R().SetContext(ctx).SetQueryParams(map[string]string{
"oe": orderId,
@@ -341,7 +335,7 @@ func (s *SendCardTaskTypeNuclear) channelOne(ctx context.Context, orderItem Orde
span.AddEvent("retrySubmit")
continue
}
if strings.Contains(submitRespStr.Msg, "访问异常,页面刷新后请重试") {
if strings.Contains(submitRespStr.Msg, "访问异常,页面刷新后请重试") || strings.Contains(submitRespStr.Msg, "当前操作频繁操作") {
needChangeProxyId = utils.GenerateId()
fingerprintHash = fingerprint.GenerateRandomBrowserFingerprintHash()
span.AddEvent("startRefreshPage")
@@ -449,6 +443,14 @@ func (s *SendCardTaskTypeNuclear) channelThree(ctx context.Context, orderItem Or
}
func (s *SendCardTaskTypeNuclear) HandleSendCardTask(ctx context.Context, orderItem OrderPoolItem, task SendCardTask) error {
ctx, span := otelTrace.Span(ctx, "SendCardTaskTypeNuclear", "SendCardTaskTypeNuclear.HandleSendCardTask", trace.WithAttributes(
attribute.String("bankOrderId", task.LocalOrderID),
attribute.String("cardNo", task.CardInfo.CardNo),
attribute.String("cardPassword", task.CardInfo.Data),
attribute.String("orderId", orderItem.OrderID),
attribute.String("remoteOrderId", orderItem.RemoteOrderID),
))
defer span.End()
if strings.Contains(orderItem.PayURL, "baolong18080.com") {
return s.channelOne(ctx, orderItem, task)
}

View File

@@ -563,12 +563,15 @@ func (s *OrderPoolServiceImpl) SubmitOrder(ctx context.Context, task card_sender
var orderItem card_sender.OrderPoolItem
for range 3 {
span.AddEvent("create order")
orderItem, err := task.SendCardTaskType.GetSendCardTaskType().
CreateOrder(ctx, task.RoadUid, task.CardInfo.GetFaceTypeFloat(ctx))
if err != nil {
span.AddEvent("create order failed")
return fmt.Errorf("创建订单失败: %v", err)
}
span.AddEvent("bind order")
if err = task.SendCardTaskType.GetSendCardTaskType().BindPoolOrderId(ctx, orderItem, task); err != nil {
otelTrace.Logger.WithContext(ctx).Error("绑定订单ID和卡片信息ID失败", zap.Error(err))
return fmt.Errorf("绑定订单ID和卡片信息ID失败: %v", err)
@@ -577,10 +580,13 @@ func (s *OrderPoolServiceImpl) SubmitOrder(ctx context.Context, task card_sender
// 绑定订单ID和卡片信息ID
bindKey := fmt.Sprintf("%s:%s", s.config.OrderBindKey, orderItem.OrderID)
if err = s.redisClient.Set(ctx, bindKey, task.LocalOrderID, s.config.OrderBindKeyActiveTime); err != nil {
span.AddEvent("绑定订单ID和卡片信息ID失败")
return fmt.Errorf("绑定订单ID和卡片信息ID失败: %v", err)
}
span.AddEvent("handle order")
err = task.SendCardTaskType.GetSendCardTaskType().HandleSendCardTask(ctx, orderItem, task)
if err != nil {
span.AddEvent("handle order failed")
if strings.Contains(err.Error(), "重新下单") {
_ = s.unboundPoolOrderId(ctx, task.SendCardTaskType, orderItem, task)
continue