package order import ( "context" "gorm.io/gorm" ) // RefundStarter 由支付模块适配实现,避免 order 直接依赖 payment。 type RefundStarter interface { StartRefund(ctx context.Context, orderID uint64, refundAmountCent int64, bizType string, remark string) (status string, err error) } type RefundStarterFunc func(ctx context.Context, orderID uint64, refundAmountCent int64, bizType string, remark string) (status string, err error) func (fn RefundStarterFunc) StartRefund(ctx context.Context, orderID uint64, refundAmountCent int64, bizType string, remark string) (string, error) { return fn(ctx, orderID, refundAmountCent, bizType, remark) } type OrderChatNotifier interface { NotifyNewConversation(conversationID uint64) } // OrderChatArchiver 由 chat 模块适配实现,在订单封存时于同一事务内解散关联群聊。 // 实际聊天群按 listing 关联(发布群 listing_group),故传 listingID。 type OrderChatArchiver interface { ArchiveListingConversation(tx *gorm.DB, listingID uint64, reason string) error } type Dependencies struct { ChatNotifier OrderChatNotifier ChatArchiver OrderChatArchiver RefundStarter RefundStarter } type refundAction struct { OrderID uint64 RefundAmountCent int64 BizType string Remark string } type Repository struct { db *gorm.DB chatNotifier OrderChatNotifier chatArchiver OrderChatArchiver refundStarter RefundStarter } const defaultPendingPaymentTimeoutMinutes = 15 func NewRepository(db *gorm.DB, deps ...Dependencies) *Repository { repo := &Repository{db: db} if len(deps) > 0 { repo.chatNotifier = deps[0].ChatNotifier repo.chatArchiver = deps[0].ChatArchiver repo.refundStarter = deps[0].RefundStarter } return repo } func (r *Repository) NotifyNewConversation(conversationID uint64) { if conversationID > 0 && r.chatNotifier != nil { r.chatNotifier.NotifyNewConversation(conversationID) } }