package repository import ( "context" "errors" "gorm.io/gorm" "pay-bridge/internal/model" ) // ProfitSharingRepository 分润数据访问 type ProfitSharingRepository struct { db *gorm.DB } func NewProfitSharingRepository(db *gorm.DB) *ProfitSharingRepository { return &ProfitSharingRepository{db: db} } // GetConfigByAppID 按 app_id 获取分润配置 func (r *ProfitSharingRepository) GetConfigByAppID(ctx context.Context, appID string) (*model.ProfitSharingConfig, error) { var cfg model.ProfitSharingConfig err := r.db.WithContext(ctx).Where("app_id = ? AND status = 1", appID).First(&cfg).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } return &cfg, err } // SaveConfig 创建或更新分润配置 func (r *ProfitSharingRepository) SaveConfig(ctx context.Context, cfg *model.ProfitSharingConfig) error { return r.db.WithContext(ctx).Save(cfg).Error } // CreateOrder 创建分润记录 func (r *ProfitSharingRepository) CreateOrder(ctx context.Context, order *model.ProfitSharingOrder) error { return r.db.WithContext(ctx).Create(order).Error } // GetOrderByTradeNo 按 trade_no 查询分润记录 func (r *ProfitSharingRepository) GetOrderByTradeNo(ctx context.Context, tradeNo string) (*model.ProfitSharingOrder, error) { var order model.ProfitSharingOrder err := r.db.WithContext(ctx).Where("trade_no = ?", tradeNo).First(&order).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } return &order, err } // GetOrderBySharingNo 按 sharing_no 查询 func (r *ProfitSharingRepository) GetOrderBySharingNo(ctx context.Context, sharingNo string) (*model.ProfitSharingOrder, error) { var order model.ProfitSharingOrder err := r.db.WithContext(ctx).Where("sharing_no = ?", sharingNo).First(&order).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } return &order, err } // UpdateOrderStatus 更新分润状态 func (r *ProfitSharingRepository) UpdateOrderStatus(ctx context.Context, sharingNo string, fromStatus, toStatus model.ProfitSharingStatus, updates map[string]any) (bool, error) { if updates == nil { updates = make(map[string]any) } updates["status"] = toStatus result := r.db.WithContext(ctx).Model(&model.ProfitSharingOrder{}). Where("sharing_no = ? AND status = ?", sharingNo, fromStatus). Updates(updates) if result.Error != nil { return false, result.Error } return result.RowsAffected > 0, nil } // CreateLog 记录分润流水 func (r *ProfitSharingRepository) CreateLog(ctx context.Context, log *model.ProfitSharingLog) error { return r.db.WithContext(ctx).Create(log).Error } // ListPendingOrders 查询需要补偿的分润单(PROCESSING 超时) func (r *ProfitSharingRepository) ListPendingOrders(ctx context.Context, limit int) ([]*model.ProfitSharingOrder, error) { var orders []*model.ProfitSharingOrder err := r.db.WithContext(ctx). Where("status IN ?", []model.ProfitSharingStatus{ model.ProfitSharingStatusPending, model.ProfitSharingStatusProcessing, }). Limit(limit).Find(&orders).Error return orders, err }