feat(订单): 实现推荐奖励系统支持佣金和赠送天数两种模式
Build docker and publish / build (20.15.1) (push) Failing after 9m13s

重构推荐奖励处理逻辑,新增支持根据配置选择佣金奖励或赠送天数奖励
修改Discount相关字段类型为float64以支持小数折扣
添加GiftDays配置项控制赠送天数
新增FindActiveSubscribe方法查询用户有效订阅
This commit is contained in:
2025-10-17 06:01:29 -07:00
parent 7da63ade5c
commit bfbc675e1a
12 changed files with 139 additions and 27 deletions
+2 -2
View File
@@ -71,8 +71,8 @@ func (s *Subscribe) BeforeUpdate(tx *gorm.DB) error {
}
type Discount struct {
Months int64 `json:"months"`
Discount int64 `json:"discount"`
Months int64 `json:"months"`
Discount float64 `json:"discount"`
}
type Group struct {
+1
View File
@@ -77,6 +77,7 @@ type customUserLogicModel interface {
QueryUserSubscribe(ctx context.Context, userId int64, status ...int64) ([]*SubscribeDetails, error)
FindOneSubscribeDetailsById(ctx context.Context, id int64) (*SubscribeDetails, error)
FindOneUserSubscribe(ctx context.Context, id int64) (*SubscribeDetails, error)
FindActiveSubscribe(ctx context.Context, userId int64) (*Subscribe, error)
FindUsersSubscribeBySubscribeId(ctx context.Context, subscribeId int64) ([]*Subscribe, error)
UpdateUserSubscribeWithTraffic(ctx context.Context, id, download, upload int64, tx ...*gorm.DB) error
QueryResisterUserTotalByDate(ctx context.Context, date time.Time) (int64, error)
+21
View File
@@ -198,3 +198,24 @@ func (m *defaultUserModel) DeleteSubscribeById(ctx context.Context, id int64, tx
func (m *defaultUserModel) ClearSubscribeCache(ctx context.Context, data ...*Subscribe) error {
return m.ClearSubscribeCacheByModels(ctx, data...)
}
// FindActiveSubscribe finds the user's active subscription
func (m *defaultUserModel) FindActiveSubscribe(ctx context.Context, userId int64) (*Subscribe, error) {
var data Subscribe
err := m.QueryNoCacheCtx(ctx, &data, func(conn *gorm.DB, v interface{}) error {
now := time.Now()
return conn.Model(&Subscribe{}).
Where("user_id = ? AND status = ? AND expire_time > ?", userId, 1, now).
Order("expire_time DESC").
First(&data).Error
})
if err != nil {
if err == gorm.ErrRecordNotFound {
return nil, nil
}
return nil, err
}
return &data, nil
}