对照生产抓包修复发货链路:BFF 地址、上游单号取值与直判交付
- 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)
This commit is contained in:
+1
-1
@@ -18,7 +18,7 @@ OPEN_SIGN_SKEW=300
|
|||||||
OPEN_API_DEBUG=false
|
OPEN_API_DEBUG=false
|
||||||
LOG_FILE=logs/app.log
|
LOG_FILE=logs/app.log
|
||||||
DELIVERY_BASE_URL=
|
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_CHANNEL=dlc
|
||||||
DELIVERY_LINK_SECRET=change_me_for_delivery_link_sign
|
DELIVERY_LINK_SECRET=change_me_for_delivery_link_sign
|
||||||
DELIVERY_LINK_TTL_MINUTES=120
|
DELIVERY_LINK_TTL_MINUTES=120
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ type Config struct {
|
|||||||
LogFile string
|
LogFile string
|
||||||
// DeliveryBaseURL 用户侧发货页面基础地址;为空时前端可自行按当前域名拼接。
|
// DeliveryBaseURL 用户侧发货页面基础地址;为空时前端可自行按当前域名拼接。
|
||||||
DeliveryBaseURL string
|
DeliveryBaseURL string
|
||||||
// DeliveryBFFBaseURL 上游测试发货 BFF 地址。
|
// DeliveryBFFBaseURL 上游发货 BFF 地址。
|
||||||
DeliveryBFFBaseURL string
|
DeliveryBFFBaseURL string
|
||||||
// DeliveryChannel 上游测试发货渠道前缀,如 dlc。
|
// DeliveryChannel 上游测试发货渠道前缀,如 dlc。
|
||||||
DeliveryChannel string
|
DeliveryChannel string
|
||||||
@@ -67,7 +67,7 @@ func Load() *Config {
|
|||||||
OpenAPIDebug: debugOpen,
|
OpenAPIDebug: debugOpen,
|
||||||
LogFile: getEnv("LOG_FILE", "logs/app.log"),
|
LogFile: getEnv("LOG_FILE", "logs/app.log"),
|
||||||
DeliveryBaseURL: getEnv("DELIVERY_BASE_URL", ""),
|
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"),
|
DeliveryChannel: getEnv("DELIVERY_CHANNEL", "dlc"),
|
||||||
DeliveryLinkSecret: getEnv("DELIVERY_LINK_SECRET", getEnv("OPEN_API_SECRET", getEnv("JWT_SECRET", "affiliate-dash-dev-secret-change-me"))),
|
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),
|
DeliveryLinkTTLMinutes: getEnvInt("DELIVERY_LINK_TTL_MINUTES", 120),
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import (
|
|||||||
"gorm.io/gorm/clause"
|
"gorm.io/gorm/clause"
|
||||||
)
|
)
|
||||||
|
|
||||||
const defaultDeliveryBFFBaseURL = "https://www.jxya.top/bff-stg"
|
const defaultDeliveryBFFBaseURL = "https://www.jxya.top/bff"
|
||||||
|
|
||||||
// 发货提交阶段,持久化在 result_data.provider_order_stage 中,供排障与补偿扫描区分处理。
|
// 发货提交阶段,持久化在 result_data.provider_order_stage 中,供排障与补偿扫描区分处理。
|
||||||
const (
|
const (
|
||||||
@@ -339,9 +339,9 @@ func (s *DeliveryService) submit(orderNo, gameAccount, bindUUID string, apiClien
|
|||||||
}
|
}
|
||||||
providerOrderNo := firstNonEmpty(
|
providerOrderNo := firstNonEmpty(
|
||||||
stringFromMap(upstreamOrder, "order_no"),
|
stringFromMap(upstreamOrder, "order_no"),
|
||||||
stringFromMap(upstreamOrder, "order_sn"),
|
|
||||||
stringFromMap(upstreamOrder, "_id"),
|
stringFromMap(upstreamOrder, "_id"),
|
||||||
stringFromMap(upstreamOrder, "id"),
|
stringFromMap(upstreamOrder, "id"),
|
||||||
|
stringFromMap(upstreamOrder, "order_sn"),
|
||||||
queueOrderID,
|
queueOrderID,
|
||||||
)
|
)
|
||||||
resultData := mergeResultData(claimed.ResultData, map[string]interface{}{
|
resultData := mergeResultData(claimed.ResultData, map[string]interface{}{
|
||||||
@@ -353,11 +353,17 @@ func (s *DeliveryService) submit(orderNo, gameAccount, bindUUID string, apiClien
|
|||||||
"game_channel": gameChannelText(boundAccount),
|
"game_channel": gameChannelText(boundAccount),
|
||||||
"upstream_order": upstreamOrder,
|
"upstream_order": upstreamOrder,
|
||||||
})
|
})
|
||||||
|
nextStatus := model.OrderStatusDelivering
|
||||||
|
message := "已提交上游发货,等待发货结果回传"
|
||||||
|
if upstreamDeliverySucceeded(upstreamOrder) {
|
||||||
|
nextStatus = model.OrderStatusDelivered
|
||||||
|
message = "上游已返回发货成功"
|
||||||
|
}
|
||||||
updated, err := s.fulfillment.UpdateFulfillment(FulfillmentUpdateInput{
|
updated, err := s.fulfillment.UpdateFulfillment(FulfillmentUpdateInput{
|
||||||
MerchantID: order.MerchantID,
|
MerchantID: order.MerchantID,
|
||||||
APIClientID: apiClientID,
|
APIClientID: apiClientID,
|
||||||
OrderNo: order.OrderNo,
|
OrderNo: order.OrderNo,
|
||||||
Status: model.OrderStatusDelivering,
|
Status: nextStatus,
|
||||||
ProviderOrderNo: providerOrderNo,
|
ProviderOrderNo: providerOrderNo,
|
||||||
ResultData: resultData,
|
ResultData: resultData,
|
||||||
})
|
})
|
||||||
@@ -367,7 +373,7 @@ func (s *DeliveryService) submit(orderNo, gameAccount, bindUUID string, apiClien
|
|||||||
return &DeliverySubmitResult{
|
return &DeliverySubmitResult{
|
||||||
OrderNo: updated.OrderNo,
|
OrderNo: updated.OrderNo,
|
||||||
Status: normalizeOrderStatus(updated),
|
Status: normalizeOrderStatus(updated),
|
||||||
Message: "已提交上游发货,等待发货结果回传",
|
Message: message,
|
||||||
ProviderOrderNo: providerOrderNo,
|
ProviderOrderNo: providerOrderNo,
|
||||||
GameAccount: boundAccount,
|
GameAccount: boundAccount,
|
||||||
UpstreamOrder: upstreamOrder,
|
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 {
|
func optionalUint(value uint) *uint {
|
||||||
if value == 0 {
|
if value == 0 {
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -189,7 +189,10 @@ func TestDeliveryMerchantApiBindAndSubmit(t *testing.T) {
|
|||||||
"code": 0,
|
"code": 0,
|
||||||
"data": map[string]interface{}{
|
"data": map[string]interface{}{
|
||||||
"order": 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 {
|
if err != nil {
|
||||||
t.Fatalf("submit for merchant: %v", err)
|
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)
|
t.Fatalf("unexpected submit result: %+v", submitted)
|
||||||
}
|
}
|
||||||
var afterSubmit model.FulfillmentOrder
|
var afterSubmit model.FulfillmentOrder
|
||||||
if err := db.Where("order_no = ?", created.Order.OrderNo).First(&afterSubmit).Error; err != nil {
|
if err := db.Where("order_no = ?", created.Order.OrderNo).First(&afterSubmit).Error; err != nil {
|
||||||
t.Fatalf("reload after submit: %v", err)
|
t.Fatalf("reload after submit: %v", err)
|
||||||
}
|
}
|
||||||
if afterSubmit.OrderStatus != model.OrderStatusDelivering || afterSubmit.ProviderOrderNo != "provider-1" {
|
if afterSubmit.OrderStatus != model.OrderStatusDelivered || afterSubmit.ProviderOrderNo != "provider-1" || afterSubmit.DeliveredAt == nil {
|
||||||
t.Fatalf("submit should persist delivering state: %+v", afterSubmit)
|
t.Fatalf("submit should persist delivered state: %+v", afterSubmit)
|
||||||
}
|
}
|
||||||
if atomic.LoadInt32(&queueCreateCalls) != 1 || atomic.LoadInt32(&upstreamCalls) != 1 {
|
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)
|
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 {
|
if err != nil {
|
||||||
t.Fatalf("repeat submit for merchant: %v", err)
|
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)
|
t.Fatalf("repeat submit should reuse existing result: %+v", second)
|
||||||
}
|
}
|
||||||
if atomic.LoadInt32(&queueCreateCalls) != 1 || atomic.LoadInt32(&upstreamCalls) != 1 {
|
if atomic.LoadInt32(&queueCreateCalls) != 1 || atomic.LoadInt32(&upstreamCalls) != 1 {
|
||||||
|
|||||||
+1
-1
@@ -46,7 +46,7 @@ services:
|
|||||||
- OPEN_API_DEBUG=${OPEN_API_DEBUG:-false}
|
- OPEN_API_DEBUG=${OPEN_API_DEBUG:-false}
|
||||||
- LOG_FILE=${LOG_FILE:-logs/app.log}
|
- LOG_FILE=${LOG_FILE:-logs/app.log}
|
||||||
- DELIVERY_BASE_URL=${DELIVERY_BASE_URL:-}
|
- 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_CHANNEL=${DELIVERY_CHANNEL:-dlc}
|
||||||
- DELIVERY_LINK_SECRET=${DELIVERY_LINK_SECRET:-}
|
- DELIVERY_LINK_SECRET=${DELIVERY_LINK_SECRET:-}
|
||||||
- DELIVERY_LINK_TTL_MINUTES=${DELIVERY_LINK_TTL_MINUTES:-120}
|
- DELIVERY_LINK_TTL_MINUTES=${DELIVERY_LINK_TTL_MINUTES:-120}
|
||||||
|
|||||||
Reference in New Issue
Block a user