package handler import ( "encoding/json" "time" "soul-api/internal/model" "gorm.io/gorm" ) // computeOrderCommission 按订单计算应付给推广者的佣金 // 会员订单:推广者会员 20%、非会员 10%;内容订单:90%(好友优惠 5% 仅针对内容) // order: 已支付订单,需有 product_type、amount、referrer_id // referrerUser: 推广者用户信息,用于判断 is_vip(可为 nil,会查库) // preloadConfig: 可选,预加载的 referral_config,避免 N+1 查询 func computeOrderCommission(db *gorm.DB, order *model.Order, referrerUser *model.User, preloadConfig ...*model.SystemConfig) float64 { if order == nil || order.ReferrerID == nil || *order.ReferrerID == "" { return 0 } // 读取推广配置 distributorShare := 0.9 userDiscount := 0.0 vipOrderShareVip := 20.0 vipOrderShareNonVip := 10.0 var cfg *model.SystemConfig if len(preloadConfig) > 0 && preloadConfig[0] != nil { cfg = preloadConfig[0] } else if row, err := (func() (*model.SystemConfig, error) { var r model.SystemConfig e := db.Where("config_key = ?", "referral_config").First(&r).Error return &r, e })(); err == nil { cfg = row } if cfg != nil { var config map[string]interface{} if err := json.Unmarshal(cfg.ConfigValue, &config); err == nil { if share, ok := config["distributorShare"].(float64); ok { distributorShare = share / 100 } if disc, ok := config["userDiscount"].(float64); ok { userDiscount = disc / 100 } if v, ok := config["vipOrderShareVip"].(float64); ok { vipOrderShareVip = v / 100 } if v, ok := config["vipOrderShareNonVip"].(float64); ok { vipOrderShareNonVip = v / 100 } } } // 会员订单:无好友优惠,按推广者是否会员分 20%/10% if order.ProductType == "vip" { base := order.Amount var referrer model.User if referrerUser != nil { referrer = *referrerUser } else if err := db.Where("id = ?", *order.ReferrerID).First(&referrer).Error; err != nil { return 0 } isVip := referrer.IsVip != nil && *referrer.IsVip if referrer.VipExpireDate != nil && referrer.VipExpireDate.Before(time.Now()) { isVip = false } if isVip { return base * vipOrderShareVip } return base * vipOrderShareNonVip } // 内容订单:若有推荐人且 userDiscount>0,反推原价;否则按实付 commissionBase := order.Amount if userDiscount > 0 && (order.ReferrerID != nil && *order.ReferrerID != "" || (order.ReferralCode != nil && *order.ReferralCode != "")) { if (1 - userDiscount) > 0 { commissionBase = order.Amount / (1 - userDiscount) } } return commissionBase * distributorShare }