Files
affiliate_dash/backend/internal/service/fulfillment.go
T
yml2213 5ed36c724f refactor(fulfillment): 按职责拆分 fulfillment.go(640 → 最大 235 行)
纯文件级移动,无行为变更,沿用既有的 fulfillment_<aspect>.go 命名约定:
- fulfillment.go            结构体、构造函数、上游钩子、CanFulfill、orderCallbackData
- fulfillment_create.go     下单类型定义、CreateManualOrder、CreateOrder
- fulfillment_testorder.go  联调测试订单
- fulfillment_update.go     履约结果更新
- fulfillment_cancel.go     取消订单(含上游联动取消)

校验:拆分前后 19 个 func/type 声明完全一致(无缺失、无多出、无重复)。
2026-10-06 19:50:13 +08:00

79 lines
2.5 KiB
Go

package service
import (
"context"
"affiliate_dash/internal/model"
"gorm.io/gorm"
)
type FulfillmentService struct {
db *gorm.DB
callbacks *CallbackService
upstreamCancel func(order *model.FulfillmentOrder) error
upstreamSync func(ctx context.Context, order *model.FulfillmentOrder) (bool, error)
}
func NewFulfillmentService(db *gorm.DB, callbacks *CallbackService) *FulfillmentService {
return &FulfillmentService{db: db, callbacks: callbacks}
}
// SetUpstreamCancel 注册取消订单时同步取消上游履约单的钩子(如乐玩 CancelOrder)。
func (s *FulfillmentService) SetUpstreamCancel(fn func(order *model.FulfillmentOrder) error) {
s.upstreamCancel = fn
}
// SetUpstreamSync 注册主动查单同步上游状态的钩子(如乐玩订单补偿)。
func (s *FulfillmentService) SetUpstreamSync(fn func(ctx context.Context, order *model.FulfillmentOrder) (bool, error)) {
s.upstreamSync = fn
}
func CanFulfill(order *model.FulfillmentOrder) (bool, string) {
switch normalizeOrderStatus(order) {
case model.OrderStatusPaid:
return true, ""
case model.OrderStatusShipFailed:
if deliverySubmittedUpstream(order) {
return false, "订单已提交上游,为避免重复发货请先确认上游状态"
}
return true, ""
case model.OrderStatusDelivering:
return false, "订单发货中"
case model.OrderStatusDelivered:
return false, "订单已交付"
case model.OrderStatusCancelled:
return false, "订单已取消"
default:
return false, "订单状态不可发货"
}
}
func orderCallbackData(order *model.FulfillmentOrder) map[string]interface{} {
canShip, cannotShipReason := CanFulfill(order)
data := map[string]interface{}{
"order_no": order.OrderNo,
"client_order_no": order.ClientOrderNo,
"product_sku": order.ProductSKU,
"quantity": order.Quantity,
"base_amount": order.BaseAmount,
"fee_type": order.FeeType,
"service_fee_amount": order.ServiceFeeAmount,
"amount": order.Amount,
"currency": order.Currency,
"order_status": normalizeOrderStatus(order),
"order_source": order.OrderSource,
"can_ship": canShip,
"cannot_ship_reason": cannotShipReason,
"provider_order_no": order.ProviderOrderNo,
"failure_reason": order.FailureReason,
}
if requestData := requestDataMap(order.RequestData); len(requestData) > 0 {
data["data"] = requestData
}
return data
}
// ----- 仪表盘统计 -----
// DashboardStats 仪表盘聚合指标。