send_gift.go 2.68 KB
Newer Older
hujiebin's avatar
hujiebin committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
package event_m

import (
	"git.hilo.cn/hilo-common/domain"
	"git.hilo.cn/hilo-common/resource/mysql"
	"github.com/pkg/errors"
	"gorm.io/gorm"
	"time"
)

// 送礼事件消息
type EventGiftSend struct {
	mysql.Entity
	*domain.Model `gorm:"-"`
	Proto         mysql.Type
	Payload       []byte
	Mark          mysql.YesNo
	MarkHiloGroup mysql.YesNo
	MarkHiloUser  mysql.YesNo
}

func (EventGiftSend) TableName() string {
	return "event_gift_send"
}

// 偏移值
type EventGiftSendOffsetHiloUser struct {
	mysql.Entity
	*domain.Model `gorm:"-"`
	MarkOffset    mysql.ID
}

// 获取当前偏移值
func Offset(model *domain.Model) (*EventGiftSendOffsetHiloUser, error) {
	offset := new(EventGiftSendOffsetHiloUser)
	if err := model.Db.WithContext(model).First(offset).Error; err != nil {
		if err != gorm.ErrRecordNotFound {
			model.Log.Errorf("Offset fail:%v", err)
			return nil, err
		}
		// gorm.ErrRecordNotFound
	}
	offset.Model = model
	return offset, nil
}

// 批量获取送礼
func FetchEventGiftSend(model *domain.Model, limit int) ([]*EventGiftSend, *EventGiftSendOffsetHiloUser, error) {
	offset, err := Offset(model)
	if err != nil {
		return nil, nil, err
	}
	var events []*EventGiftSend
	if err := model.Db.WithContext(model).Model(EventGiftSend{}).
		Where("id > ?", offset.MarkOffset).
		Order("id asc").Limit(limit).Find(&events).Error; err != nil {
		model.Log.Errorf("FetchEventGiftSend fail:%v", err)
		return nil, nil, err
	}
	return events, offset, nil
}

// 标记已完成
func (p *EventGiftSend) MarkDone() error {
	p.MarkHiloUser = mysql.YES
	result := p.Db.WithContext(p.Model).Model(EventGiftSend{}).Where("id = ?", p.ID).Update("mark_hilo_user", p.MarkHiloUser).Limit(1)
	if result.Error != nil {
		return result.Error
	}
	if result.RowsAffected <= 0 {
		p.Model.Log.Errorf("MarkDone row affeced 0")
		return errors.New("row affect 0")
	}
	return nil
}

// 查询过去1小时-5分钟前未mark的事件
// 用来补偿
// 记得加limit
func FetchUnMarkEvents(model *domain.Model, limit int) ([]*EventGiftSend, error) {
	offset, err := Offset(model)
	if err != nil {
		return nil, err
	}
	t := time.Now().Add(-time.Minute * 5)
	lt := t.Add(-time.Hour)
	var events []*EventGiftSend
	if err := model.Db.WithContext(model).Model(EventGiftSend{}).
		Where("mark_hilo_user = ?", mysql.NO).
		Where("id <= ?", offset.MarkOffset).
		Where("created_time < ?", t).
		Where("created_time > ?", lt).
		Order("id asc").Limit(limit).Find(&events).Error; err != nil {
		model.Log.Errorf("FetchUnMarkEvents fail:%v", err)
		return nil, err
	}
	return events, nil
}

// 补偿加上unmark的event
func AddUnMarkEvent(model *domain.Model, event *EventGiftSend) error {
	return model.Db.WithContext(model).Create(event).Error
}