| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- 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
- }
|