package repository import ( "errors" "time" "gorm.io/gorm" "wails-app/internal/dao" ) type OrderRepository struct{} // GetByOrderNo 按订单号取订单。 func (r *OrderRepository) GetByOrderNo(db *gorm.DB, orderNo string) (*dao.ExitOrder, error) { var order dao.ExitOrder if err := db.Where("order_no = ?", orderNo).First(&order).Error; err != nil { return nil, err } return &order, nil } // FindReusablePending 找同会话未过期的待支付订单(复用,避免重复建单)。 func (r *OrderRepository) FindReusablePending(db *gorm.DB, sessionID uint) (*dao.ExitOrder, error) { var order dao.ExitOrder err := db.Where("session_id = ? AND state = ? AND expire_at > ?", sessionID, dao.ExitOrderPending, time.Now()).Order("id DESC").First(&order).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } if err != nil { return nil, err } return &order, nil } // ListPendingForQuery 待支付且未过期的订单(定时查单任务用)。 func (r *OrderRepository) ListPendingForQuery(db *gorm.DB, limit int) ([]dao.ExitOrder, error) { var orders []dao.ExitOrder err := db.Where("state = ? AND expire_at > ?", dao.ExitOrderPending, time.Now()). Order("id ASC").Limit(limit).Find(&orders).Error return orders, err } // ExpireStale 批量把超过有效期仍未支付的订单标记过期,返回影响行数。 func (r *OrderRepository) ExpireStale(db *gorm.DB) int64 { result := db.Model(&dao.ExitOrder{}). Where("state = ? AND expire_at <= ?", dao.ExitOrderPending, time.Now()). Updates(map[string]interface{}{"state": dao.ExitOrderExpired}) if result.Error != nil { return 0 } return result.RowsAffected }