- 后端 internal/service 按职责拆分: fulfillment.go(1397→527)拆出 wallet/timeout/data/order/query/dashboard/shipnotify delivery.go(1124→801)拆出 upstream/link/state/helpers merchant.go(855→251)拆出 member/product/api_client/catalog/helpers - 前端 MerchantCenter.tsx(1327→606)拆出 merchantCenterTabs/merchantCenterUtils - docker-compose backend 透传 CORS_ALLOWED_ORIGINS - CORS 白名单实现(config/router/README/.env.example 配套) - 修复 gofmt 与文件尾部多余空行
72 lines
1.9 KiB
Go
72 lines
1.9 KiB
Go
package service
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
"time"
|
|
|
|
"affiliate_dash/internal/model"
|
|
"affiliate_dash/internal/pkg/timeutil"
|
|
)
|
|
|
|
func buildExistingDeliverySubmitResult(order *model.FulfillmentOrder) *DeliverySubmitResult {
|
|
if order == nil {
|
|
return nil
|
|
}
|
|
switch normalizeOrderStatus(order) {
|
|
case model.OrderStatusDelivering, model.OrderStatusDelivered:
|
|
default:
|
|
return nil
|
|
}
|
|
var resultData map[string]interface{}
|
|
if json.Valid([]byte(order.ResultData)) {
|
|
_ = json.Unmarshal([]byte(order.ResultData), &resultData)
|
|
}
|
|
providerOrderNo := firstNonEmpty(
|
|
order.ProviderOrderNo,
|
|
stringFromMap(resultData, "provider_order_no"),
|
|
)
|
|
message := "订单暂时正在发货中,请稍后查询"
|
|
status := normalizeOrderStatus(order)
|
|
if status == model.OrderStatusDelivered {
|
|
message = "订单已交付"
|
|
}
|
|
return &DeliverySubmitResult{
|
|
OrderNo: order.OrderNo,
|
|
Status: status,
|
|
Message: message,
|
|
ProviderOrderNo: providerOrderNo,
|
|
UpstreamOrder: resultData,
|
|
}
|
|
}
|
|
|
|
func upstreamDeliverySucceeded(order map[string]interface{}) bool {
|
|
return strings.EqualFold(stringFromMap(order, "status"), "FINISHED") ||
|
|
strings.EqualFold(stringFromMap(order, "send_status"), "SUCCESS")
|
|
}
|
|
|
|
func deliverySubmissionInProgress(stage string) bool {
|
|
return stage == deliveryStageClaimed || stage == deliveryStageQueueCreated
|
|
}
|
|
|
|
func deliverySubmissionStale(order *model.FulfillmentOrder, now time.Time) bool {
|
|
if order == nil {
|
|
return false
|
|
}
|
|
startedAtRaw := resultDataString(order.ResultData, "submit_started_at")
|
|
if startedAtRaw != "" {
|
|
if startedAt, err := time.Parse(timeutil.APITimeLayout, startedAtRaw); err == nil {
|
|
return now.Sub(startedAt) >= deliverySubmissionStaleTimeout
|
|
}
|
|
}
|
|
return !order.UpdatedAt.IsZero() && now.Sub(order.UpdatedAt) >= deliverySubmissionStaleTimeout
|
|
}
|
|
|
|
func optionalUint(value uint) *uint {
|
|
if value == 0 {
|
|
return nil
|
|
}
|
|
out := value
|
|
return &out
|
|
}
|