feat(v2): outbox 退款感知(refund_id 进唯一键)+ 投递门禁放行退款态 + Enqueue 贯通 refundID

This commit is contained in:
wangjia
2026-07-10 16:26:32 +08:00
parent 0912027c69
commit ed5ec5c894
12 changed files with 84 additions and 28 deletions
+7 -5
View File
@@ -17,14 +17,16 @@ type WebhookStore struct{ db *gorm.DB }
func NewWebhookStore(db *gorm.DB) *WebhookStore { return &WebhookStore{db: db} }
// EnqueueDelivery inserts an outbox row; a duplicate (out_trade_no,event_type)
// is a no-op (idempotent enqueue) via ON CONFLICT DO NOTHING.
func (s *WebhookStore) EnqueueDelivery(outTradeNo, bizSystem, eventType, payload string) error {
// EnqueueDelivery inserts an outbox row; a duplicate (out_trade_no,event_type,refund_id)
// is a no-op (idempotent enqueue) via ON CONFLICT DO NOTHING. refundID is the
// refund's idempotency dimension (payment events pass "").
func (s *WebhookStore) EnqueueDelivery(outTradeNo, bizSystem, eventType, refundID, payload string) error {
row := model.WebhookDelivery{
OutTradeNo: outTradeNo, BizSystem: bizSystem, EventType: eventType, Payload: payload,
OutTradeNo: outTradeNo, BizSystem: bizSystem, EventType: eventType,
RefundID: refundID, Payload: payload,
}
err := s.db.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "out_trade_no"}, {Name: "event_type"}},
Columns: []clause.Column{{Name: "out_trade_no"}, {Name: "event_type"}, {Name: "refund_id"}},
DoNothing: true,
}).Create(&row).Error
if err != nil {