From 6eb05b322c910f2768c253aa6e5b8929e8713d00 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Mon, 3 Aug 2026 13:06:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E7=85=A7=E7=94=9F=E4=BA=A7=E6=8A=93?= =?UTF-8?q?=E5=8C=85=E4=BF=AE=E5=A4=8D=E5=8F=91=E8=B4=A7=E9=93=BE=E8=B7=AF?= =?UTF-8?q?=EF=BC=9ABFF=20=E5=9C=B0=E5=9D=80=E3=80=81=E4=B8=8A=E6=B8=B8?= =?UTF-8?q?=E5=8D=95=E5=8F=B7=E5=8F=96=E5=80=BC=E4=B8=8E=E7=9B=B4=E5=88=A4?= =?UTF-8?q?=E4=BA=A4=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DELIVERY_BFF_BASE_URL 默认改为 https://www.jxya.top/bff(生产实际路径,非 bff-stg) - provider_order_no 取值优先级调整为 order_no/_id/id/order_sn:抓包确认 order_sn 为平台单号回显,上游真实单号是 _id - 上游创建订单响应 status=FINISHED 或 send_status=SUCCESS 时订单直接置为 delivered,无需等待 ship-notify - 同步更新单测(mock 上游返回 _id/order_sn/FINISHED/SUCCESS) --- .env.example | 2 +- backend/internal/config/config.go | 4 ++-- backend/internal/service/delivery.go | 19 +++++++++++++++---- backend/internal/service/delivery_test.go | 13 ++++++++----- docker-compose.yml | 2 +- 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/.env.example b/.env.example index 51c1a15..034e44f 100644 --- a/.env.example +++ b/.env.example @@ -18,7 +18,7 @@ OPEN_SIGN_SKEW=300 OPEN_API_DEBUG=false LOG_FILE=logs/app.log DELIVERY_BASE_URL= -DELIVERY_BFF_BASE_URL=https://www.jxya.top/bff-stg +DELIVERY_BFF_BASE_URL=https://www.jxya.top/bff DELIVERY_CHANNEL=dlc DELIVERY_LINK_SECRET=change_me_for_delivery_link_sign DELIVERY_LINK_TTL_MINUTES=120 diff --git a/backend/internal/config/config.go b/backend/internal/config/config.go index b6d2625..389f7f3 100644 --- a/backend/internal/config/config.go +++ b/backend/internal/config/config.go @@ -28,7 +28,7 @@ type Config struct { LogFile string // DeliveryBaseURL 用户侧发货页面基础地址;为空时前端可自行按当前域名拼接。 DeliveryBaseURL string - // DeliveryBFFBaseURL 上游测试发货 BFF 地址。 + // DeliveryBFFBaseURL 上游发货 BFF 地址。 DeliveryBFFBaseURL string // DeliveryChannel 上游测试发货渠道前缀,如 dlc。 DeliveryChannel string @@ -67,7 +67,7 @@ func Load() *Config { OpenAPIDebug: debugOpen, LogFile: getEnv("LOG_FILE", "logs/app.log"), DeliveryBaseURL: getEnv("DELIVERY_BASE_URL", ""), - DeliveryBFFBaseURL: getEnv("DELIVERY_BFF_BASE_URL", "https://www.jxya.top/bff-stg"), + DeliveryBFFBaseURL: getEnv("DELIVERY_BFF_BASE_URL", "https://www.jxya.top/bff"), DeliveryChannel: getEnv("DELIVERY_CHANNEL", "dlc"), DeliveryLinkSecret: getEnv("DELIVERY_LINK_SECRET", getEnv("OPEN_API_SECRET", getEnv("JWT_SECRET", "affiliate-dash-dev-secret-change-me"))), DeliveryLinkTTLMinutes: getEnvInt("DELIVERY_LINK_TTL_MINUTES", 120), diff --git a/backend/internal/service/delivery.go b/backend/internal/service/delivery.go index 16cbf97..7701614 100644 --- a/backend/internal/service/delivery.go +++ b/backend/internal/service/delivery.go @@ -22,7 +22,7 @@ import ( "gorm.io/gorm/clause" ) -const defaultDeliveryBFFBaseURL = "https://www.jxya.top/bff-stg" +const defaultDeliveryBFFBaseURL = "https://www.jxya.top/bff" // 发货提交阶段,持久化在 result_data.provider_order_stage 中,供排障与补偿扫描区分处理。 const ( @@ -339,9 +339,9 @@ func (s *DeliveryService) submit(orderNo, gameAccount, bindUUID string, apiClien } providerOrderNo := firstNonEmpty( stringFromMap(upstreamOrder, "order_no"), - stringFromMap(upstreamOrder, "order_sn"), stringFromMap(upstreamOrder, "_id"), stringFromMap(upstreamOrder, "id"), + stringFromMap(upstreamOrder, "order_sn"), queueOrderID, ) resultData := mergeResultData(claimed.ResultData, map[string]interface{}{ @@ -353,11 +353,17 @@ func (s *DeliveryService) submit(orderNo, gameAccount, bindUUID string, apiClien "game_channel": gameChannelText(boundAccount), "upstream_order": upstreamOrder, }) + nextStatus := model.OrderStatusDelivering + message := "已提交上游发货,等待发货结果回传" + if upstreamDeliverySucceeded(upstreamOrder) { + nextStatus = model.OrderStatusDelivered + message = "上游已返回发货成功" + } updated, err := s.fulfillment.UpdateFulfillment(FulfillmentUpdateInput{ MerchantID: order.MerchantID, APIClientID: apiClientID, OrderNo: order.OrderNo, - Status: model.OrderStatusDelivering, + Status: nextStatus, ProviderOrderNo: providerOrderNo, ResultData: resultData, }) @@ -367,7 +373,7 @@ func (s *DeliveryService) submit(orderNo, gameAccount, bindUUID string, apiClien return &DeliverySubmitResult{ OrderNo: updated.OrderNo, Status: normalizeOrderStatus(updated), - Message: "已提交上游发货,等待发货结果回传", + Message: message, ProviderOrderNo: providerOrderNo, GameAccount: boundAccount, UpstreamOrder: upstreamOrder, @@ -574,6 +580,11 @@ func buildExistingDeliverySubmitResult(order *model.FulfillmentOrder) *DeliveryS } } +func upstreamDeliverySucceeded(order map[string]interface{}) bool { + return strings.EqualFold(stringFromMap(order, "status"), "FINISHED") || + strings.EqualFold(stringFromMap(order, "send_status"), "SUCCESS") +} + func optionalUint(value uint) *uint { if value == 0 { return nil diff --git a/backend/internal/service/delivery_test.go b/backend/internal/service/delivery_test.go index d8e02ce..b423c53 100644 --- a/backend/internal/service/delivery_test.go +++ b/backend/internal/service/delivery_test.go @@ -189,7 +189,10 @@ func TestDeliveryMerchantApiBindAndSubmit(t *testing.T) { "code": 0, "data": map[string]interface{}{ "order": map[string]interface{}{ - "order_no": "provider-1", + "_id": "provider-1", + "order_sn": "local-order-sn", + "status": "FINISHED", + "send_status": "SUCCESS", }, }, }) @@ -232,15 +235,15 @@ func TestDeliveryMerchantApiBindAndSubmit(t *testing.T) { if err != nil { t.Fatalf("submit for merchant: %v", err) } - if submitted.Status != model.OrderStatusDelivering || submitted.ProviderOrderNo != "provider-1" { + if submitted.Status != model.OrderStatusDelivered || submitted.ProviderOrderNo != "provider-1" { t.Fatalf("unexpected submit result: %+v", submitted) } var afterSubmit model.FulfillmentOrder if err := db.Where("order_no = ?", created.Order.OrderNo).First(&afterSubmit).Error; err != nil { t.Fatalf("reload after submit: %v", err) } - if afterSubmit.OrderStatus != model.OrderStatusDelivering || afterSubmit.ProviderOrderNo != "provider-1" { - t.Fatalf("submit should persist delivering state: %+v", afterSubmit) + if afterSubmit.OrderStatus != model.OrderStatusDelivered || afterSubmit.ProviderOrderNo != "provider-1" || afterSubmit.DeliveredAt == nil { + t.Fatalf("submit should persist delivered state: %+v", afterSubmit) } if atomic.LoadInt32(&queueCreateCalls) != 1 || atomic.LoadInt32(&upstreamCalls) != 1 { t.Fatalf("first submit should only create one queue, queue=%d upstream=%d requests=%v", queueCreateCalls, upstreamCalls, requestLog) @@ -249,7 +252,7 @@ func TestDeliveryMerchantApiBindAndSubmit(t *testing.T) { if err != nil { t.Fatalf("repeat submit for merchant: %v", err) } - if second.ProviderOrderNo != "provider-1" || second.Status != model.OrderStatusDelivering { + if second.ProviderOrderNo != "provider-1" || second.Status != model.OrderStatusDelivered { t.Fatalf("repeat submit should reuse existing result: %+v", second) } if atomic.LoadInt32(&queueCreateCalls) != 1 || atomic.LoadInt32(&upstreamCalls) != 1 { diff --git a/docker-compose.yml b/docker-compose.yml index 10f7e17..00ca4d8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -46,7 +46,7 @@ services: - OPEN_API_DEBUG=${OPEN_API_DEBUG:-false} - LOG_FILE=${LOG_FILE:-logs/app.log} - DELIVERY_BASE_URL=${DELIVERY_BASE_URL:-} - - DELIVERY_BFF_BASE_URL=${DELIVERY_BFF_BASE_URL:-https://www.jxya.top/bff-stg} + - DELIVERY_BFF_BASE_URL=${DELIVERY_BFF_BASE_URL:-https://www.jxya.top/bff} - DELIVERY_CHANNEL=${DELIVERY_CHANNEL:-dlc} - DELIVERY_LINK_SECRET=${DELIVERY_LINK_SECRET:-} - DELIVERY_LINK_TTL_MINUTES=${DELIVERY_LINK_TTL_MINUTES:-120}