diff --git a/apis/admin/user.api b/apis/admin/user.api index e52734d..dc0c5e8 100644 --- a/apis/admin/user.api +++ b/apis/admin/user.api @@ -32,17 +32,19 @@ type ( Id int64 `form:"id" validate:"required"` } UpdateUserBasiceInfoRequest { - UserId int64 `json:"user_id" validate:"required"` - Password string `json:"password"` - Avatar string `json:"avatar"` - Balance int64 `json:"balance"` - Commission int64 `json:"commission"` - GiftAmount int64 `json:"gift_amount"` - Telegram int64 `json:"telegram"` - ReferCode string `json:"refer_code"` - RefererId int64 `json:"referer_id"` - Enable bool `json:"enable"` - IsAdmin bool `json:"is_admin"` + UserId int64 `json:"user_id" validate:"required"` + Password string `json:"password"` + Avatar string `json:"avatar"` + Balance int64 `json:"balance"` + Commission int64 `json:"commission"` + ReferralPercentage uint8 `json:"referral_percentage"` + OnlyFirstPurchase bool `json:"only_first_purchase"` + GiftAmount int64 `json:"gift_amount"` + Telegram int64 `json:"telegram"` + ReferCode string `json:"refer_code"` + RefererId int64 `json:"referer_id"` + Enable bool `json:"enable"` + IsAdmin bool `json:"is_admin"` } UpdateUserNotifySettingRequest { UserId int64 `json:"user_id" validate:"required"` @@ -52,18 +54,20 @@ type ( EnableTradeNotify bool `json:"enable_trade_notify"` } CreateUserRequest { - Email string `json:"email"` - Telephone string `json:"telephone"` - TelephoneAreaCode string `json:"telephone_area_code"` - Password string `json:"password"` - ProductId int64 `json:"product_id"` - Duration int64 `json:"duration"` - RefererUser string `json:"referer_user"` - ReferCode string `json:"refer_code"` - Balance int64 `json:"balance"` - Commission int64 `json:"commission"` - GiftAmount int64 `json:"gift_amount"` - IsAdmin bool `json:"is_admin"` + Email string `json:"email"` + Telephone string `json:"telephone"` + TelephoneAreaCode string `json:"telephone_area_code"` + Password string `json:"password"` + ProductId int64 `json:"product_id"` + Duration int64 `json:"duration"` + ReferralPercentage uint8 `json:"referral_percentage"` + OnlyFirstPurchase bool `json:"only_first_purchase"` + RefererUser string `json:"referer_user"` + ReferCode string `json:"refer_code"` + Balance int64 `json:"balance"` + Commission int64 `json:"commission"` + GiftAmount int64 `json:"gift_amount"` + IsAdmin bool `json:"is_admin"` } UserSubscribeDetail { Id int64 `json:"id"` diff --git a/apis/types.api b/apis/types.api index 7ebf4ba..b72cea7 100644 --- a/apis/types.api +++ b/apis/types.api @@ -14,6 +14,8 @@ type ( Avatar string `json:"avatar"` Balance int64 `json:"balance"` Commission int64 `json:"commission"` + ReferralPercentage uint8 `json:"referral_percentage"` + OnlyFirstPurchase bool `json:"only_first_purchase"` GiftAmount int64 `json:"gift_amount"` Telegram int64 `json:"telegram"` ReferCode string `json:"refer_code"` diff --git a/initialize/migrate/database/02108_user_referral.down.sql b/initialize/migrate/database/02108_user_referral.down.sql new file mode 100644 index 0000000..5e838c3 --- /dev/null +++ b/initialize/migrate/database/02108_user_referral.down.sql @@ -0,0 +1,3 @@ +ALTER TABLE `u` +DROP COLUMN `referral_percentage`, +DROP COLUMN `only_first_purchase`; \ No newline at end of file diff --git a/initialize/migrate/database/02108_user_referral.up.sql b/initialize/migrate/database/02108_user_referral.up.sql new file mode 100644 index 0000000..7c8471d --- /dev/null +++ b/initialize/migrate/database/02108_user_referral.up.sql @@ -0,0 +1,7 @@ +ALTER TABLE `u` + ADD COLUMN `referral_percentage` TINYINT UNSIGNED NOT NULL DEFAULT 0 + COMMENT 'Referral Percentage' + AFTER `commission`, + ADD COLUMN `only_first_purchase` TINYINT(1) NOT NULL DEFAULT 1 + COMMENT 'Only First Purchase' + AFTER `referral_percentage`; diff --git a/internal/logic/admin/user/createUserLogic.go b/internal/logic/admin/user/createUserLogic.go index 0bfdf9f..5f6c858 100644 --- a/internal/logic/admin/user/createUserLogic.go +++ b/internal/logic/admin/user/createUserLogic.go @@ -39,10 +39,12 @@ func (l *CreateUserLogic) CreateUser(req *types.CreateUserRequest) error { } pwd := tool.EncodePassWord(req.Password) newUser := &user.User{ - Password: pwd, - ReferCode: req.ReferCode, - Balance: req.Balance, - IsAdmin: &req.IsAdmin, + Password: pwd, + ReferralPercentage: req.ReferralPercentage, + OnlyFirstPurchase: &req.OnlyFirstPurchase, + ReferCode: req.ReferCode, + Balance: req.Balance, + IsAdmin: &req.IsAdmin, } var ams []user.AuthMethods diff --git a/internal/logic/admin/user/getUserListLogic.go b/internal/logic/admin/user/getUserListLogic.go index 2546568..3859f76 100644 --- a/internal/logic/admin/user/getUserListLogic.go +++ b/internal/logic/admin/user/getUserListLogic.go @@ -41,20 +41,20 @@ func (l *GetUserListLogic) GetUserList(req *types.GetUserListRequest) (*types.Ge userRespList := make([]types.User, 0, len(list)) for _, item := range list { - var user types.User - tool.DeepCopy(&user, item) + var u types.User + tool.DeepCopy(&u, item) // 处理 AuthMethods - authMethods := make([]types.UserAuthMethod, len(user.AuthMethods)) // 直接创建目标 slice - for i, method := range user.AuthMethods { + authMethods := make([]types.UserAuthMethod, len(u.AuthMethods)) // 直接创建目标 slice + for i, method := range u.AuthMethods { tool.DeepCopy(&authMethods[i], method) if method.AuthType == "mobile" { authMethods[i].AuthIdentifier = phone.FormatToInternational(method.AuthIdentifier) } } - user.AuthMethods = authMethods + u.AuthMethods = authMethods - userRespList = append(userRespList, user) + userRespList = append(userRespList, u) } return &types.GetUserListResponse{ diff --git a/internal/logic/admin/user/updateUserBasicInfoLogic.go b/internal/logic/admin/user/updateUserBasicInfoLogic.go index c177fd9..3b451c3 100644 --- a/internal/logic/admin/user/updateUserBasicInfoLogic.go +++ b/internal/logic/admin/user/updateUserBasicInfoLogic.go @@ -44,6 +44,8 @@ func (l *UpdateUserBasicInfoLogic) UpdateUserBasicInfo(req *types.UpdateUserBasi userInfo.Balance = req.Balance userInfo.GiftAmount = req.GiftAmount userInfo.Commission = req.Commission + userInfo.OnlyFirstPurchase = &req.OnlyFirstPurchase + userInfo.ReferralPercentage = req.ReferralPercentage if req.Password != "" { if userInfo.Id == 2 && isDemo { diff --git a/internal/model/user/user.go b/internal/model/user/user.go index bbdfce3..603f98e 100644 --- a/internal/model/user/user.go +++ b/internal/model/user/user.go @@ -11,7 +11,9 @@ type User struct { Balance int64 `gorm:"default:0;comment:User Balance"` // User Balance Amount ReferCode string `gorm:"type:varchar(20);default:'';comment:Referral Code"` RefererId int64 `gorm:"index:idx_referer;comment:Referrer ID"` - Commission int64 `gorm:"default:0;comment:Commission"` // Commission Amount + Commission int64 `gorm:"default:0;comment:Commission"` // Commission Amount + ReferralPercentage uint8 `gorm:"default:0;comment:Referral"` // Referral Percentage + OnlyFirstPurchase *bool `gorm:"default:true;not null;comment:Only First Purchase"` // Only First Purchase Referral GiftAmount int64 `gorm:"default:0;comment:User Gift Amount"` Enable *bool `gorm:"default:true;not null;comment:Is Account Enabled"` IsAdmin *bool `gorm:"default:false;not null;comment:Is Admin"` diff --git a/internal/types/types.go b/internal/types/types.go index 5721a19..f7f351f 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -408,18 +408,20 @@ type CreateUserAuthMethodRequest struct { } type CreateUserRequest struct { - Email string `json:"email"` - Telephone string `json:"telephone"` - TelephoneAreaCode string `json:"telephone_area_code"` - Password string `json:"password"` - ProductId int64 `json:"product_id"` - Duration int64 `json:"duration"` - RefererUser string `json:"referer_user"` - ReferCode string `json:"refer_code"` - Balance int64 `json:"balance"` - Commission int64 `json:"commission"` - GiftAmount int64 `json:"gift_amount"` - IsAdmin bool `json:"is_admin"` + Email string `json:"email"` + Telephone string `json:"telephone"` + TelephoneAreaCode string `json:"telephone_area_code"` + Password string `json:"password"` + ProductId int64 `json:"product_id"` + Duration int64 `json:"duration"` + ReferralPercentage uint8 `json:"referral_percentage"` + OnlyFirstPurchase bool `json:"only_first_purchase"` + RefererUser string `json:"referer_user"` + ReferCode string `json:"refer_code"` + Balance int64 `json:"balance"` + Commission int64 `json:"commission"` + GiftAmount int64 `json:"gift_amount"` + IsAdmin bool `json:"is_admin"` } type CreateUserSubscribeRequest struct { @@ -2234,17 +2236,19 @@ type UpdateUserAuthMethodRequest struct { } type UpdateUserBasiceInfoRequest struct { - UserId int64 `json:"user_id" validate:"required"` - Password string `json:"password"` - Avatar string `json:"avatar"` - Balance int64 `json:"balance"` - Commission int64 `json:"commission"` - GiftAmount int64 `json:"gift_amount"` - Telegram int64 `json:"telegram"` - ReferCode string `json:"refer_code"` - RefererId int64 `json:"referer_id"` - Enable bool `json:"enable"` - IsAdmin bool `json:"is_admin"` + UserId int64 `json:"user_id" validate:"required"` + Password string `json:"password"` + Avatar string `json:"avatar"` + Balance int64 `json:"balance"` + Commission int64 `json:"commission"` + ReferralPercentage uint8 `json:"referral_percentage"` + OnlyFirstPurchase bool `json:"only_first_purchase"` + GiftAmount int64 `json:"gift_amount"` + Telegram int64 `json:"telegram"` + ReferCode string `json:"refer_code"` + RefererId int64 `json:"referer_id"` + Enable bool `json:"enable"` + IsAdmin bool `json:"is_admin"` } type UpdateUserNotifyRequest struct { @@ -2285,6 +2289,8 @@ type User struct { Avatar string `json:"avatar"` Balance int64 `json:"balance"` Commission int64 `json:"commission"` + ReferralPercentage uint8 `json:"referral_percentage"` + OnlyFirstPurchase bool `json:"only_first_purchase"` GiftAmount int64 `json:"gift_amount"` Telegram int64 `json:"telegram"` ReferCode string `json:"refer_code"` diff --git a/queue/logic/order/activateOrderLogic.go b/queue/logic/order/activateOrderLogic.go index 5064200..6773a7f 100644 --- a/queue/logic/order/activateOrderLogic.go +++ b/queue/logic/order/activateOrderLogic.go @@ -368,7 +368,14 @@ func (l *ActivateOrderLogic) handleCommission(ctx context.Context, userInfo *use return } - amount := l.calculateCommission(orderInfo.Price) + var referralPercentage uint8 + if userInfo.ReferralPercentage != 0 { + referralPercentage = userInfo.ReferralPercentage + } else { + referralPercentage = uint8(l.svc.Config.Invite.ReferralPercentage) + } + + amount := l.calculateCommission(orderInfo.Price, referralPercentage) // Use transaction for commission updates err = l.svc.DB.Transaction(func(tx *gorm.DB) error { @@ -420,12 +427,12 @@ func (l *ActivateOrderLogic) handleCommission(ctx context.Context, userInfo *use func (l *ActivateOrderLogic) shouldProcessCommission(userInfo *user.User, orderInfo *order.Order, isNewPurchase bool) bool { return userInfo.RefererId != 0 && l.svc.Config.Invite.ReferralPercentage != 0 && - (!l.svc.Config.Invite.OnlyFirstPurchase || (isNewPurchase && orderInfo.IsNew)) + (!l.svc.Config.Invite.OnlyFirstPurchase || (isNewPurchase && orderInfo.IsNew) || !*userInfo.OnlyFirstPurchase) } // calculateCommission computes the commission amount based on order price and referral percentage -func (l *ActivateOrderLogic) calculateCommission(price int64) int64 { - return int64(float64(price) * (float64(l.svc.Config.Invite.ReferralPercentage) / 100)) +func (l *ActivateOrderLogic) calculateCommission(price int64, percentage uint8) int64 { + return int64(float64(price) * (float64(percentage) / 100)) } // clearServerCache clears user list cache for all servers associated with the subscription