Files
affiliate_dash/backend/internal/service/delivery_state.go
T
yml2213 2264851d5d 拆分 service 与前端大文件,修复 CORS 配置与格式问题
- 后端 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 与文件尾部多余空行
2026-08-05 13:32:11 +08:00

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
}