repo.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package repository
  2. import (
  3. "errors"
  4. "time"
  5. "gorm.io/gorm"
  6. "wails-app/internal/dao"
  7. )
  8. type OrderRepository struct{}
  9. // GetByOrderNo 按订单号取订单。
  10. func (r *OrderRepository) GetByOrderNo(db *gorm.DB, orderNo string) (*dao.ExitOrder, error) {
  11. var order dao.ExitOrder
  12. if err := db.Where("order_no = ?", orderNo).First(&order).Error; err != nil {
  13. return nil, err
  14. }
  15. return &order, nil
  16. }
  17. // FindReusablePending 找同会话未过期的待支付订单(复用,避免重复建单)。
  18. func (r *OrderRepository) FindReusablePending(db *gorm.DB, sessionID uint) (*dao.ExitOrder, error) {
  19. var order dao.ExitOrder
  20. err := db.Where("session_id = ? AND state = ? AND expire_at > ?",
  21. sessionID, dao.ExitOrderPending, time.Now()).Order("id DESC").First(&order).Error
  22. if errors.Is(err, gorm.ErrRecordNotFound) {
  23. return nil, nil
  24. }
  25. if err != nil {
  26. return nil, err
  27. }
  28. return &order, nil
  29. }
  30. // ListPendingForQuery 待支付且未过期的订单(定时查单任务用)。
  31. func (r *OrderRepository) ListPendingForQuery(db *gorm.DB, limit int) ([]dao.ExitOrder, error) {
  32. var orders []dao.ExitOrder
  33. err := db.Where("state = ? AND expire_at > ?", dao.ExitOrderPending, time.Now()).
  34. Order("id ASC").Limit(limit).Find(&orders).Error
  35. return orders, err
  36. }
  37. // ExpireStale 批量把超过有效期仍未支付的订单标记过期,返回影响行数。
  38. func (r *OrderRepository) ExpireStale(db *gorm.DB) int64 {
  39. result := db.Model(&dao.ExitOrder{}).
  40. Where("state = ? AND expire_at <= ?", dao.ExitOrderPending, time.Now()).
  41. Updates(map[string]interface{}{"state": dao.ExitOrderExpired})
  42. if result.Error != nil {
  43. return 0
  44. }
  45. return result.RowsAffected
  46. }