package handler import ( "encoding/json" "net/http" "soul-api/internal/database" "soul-api/internal/model" "github.com/gin-gonic/gin" ) // OrdersList GET /api/orders(带用户昵称/头像/手机号,分销佣金按配置比例计算) func OrdersList(c *gin.Context) { db := database.DB() var orders []model.Order if err := db.Order("created_at DESC").Find(&orders).Error; err != nil { c.JSON(http.StatusOK, gin.H{"success": false, "error": err.Error(), "orders": []interface{}{}}) return } if len(orders) == 0 { c.JSON(http.StatusOK, gin.H{"success": true, "orders": []interface{}{}}) return } // 分销比例(与支付回调一致) distributorShare := 0.9 var cfg model.SystemConfig if err := db.Where("config_key = ?", "referral_config").First(&cfg).Error; err == nil { var config map[string]interface{} if _ = json.Unmarshal(cfg.ConfigValue, &config); config["distributorShare"] != nil { if share, ok := config["distributorShare"].(float64); ok { distributorShare = share / 100 } } } // 收集订单中的 user_id、referrer_id,查用户信息 userIDs := make(map[string]bool) for _, o := range orders { if o.UserID != "" { userIDs[o.UserID] = true } if o.ReferrerID != nil && *o.ReferrerID != "" { userIDs[*o.ReferrerID] = true } } ids := make([]string, 0, len(userIDs)) for id := range userIDs { ids = append(ids, id) } var users []model.User if len(ids) > 0 { db.Where("id IN ?", ids).Find(&users) } userMap := make(map[string]*model.User) for i := range users { userMap[users[i].ID] = &users[i] } getStr := func(s *string) string { if s == nil || *s == "" { return "" } return *s } out := make([]gin.H, 0, len(orders)) for _, o := range orders { // 序列化订单为基础字段 b, _ := json.Marshal(o) var m map[string]interface{} _ = json.Unmarshal(b, &m) // 用户信息 if u := userMap[o.UserID]; u != nil { m["userNickname"] = getStr(u.Nickname) m["userPhone"] = getStr(u.Phone) m["userAvatar"] = getStr(u.Avatar) } else { m["userNickname"] = "" m["userPhone"] = "" m["userAvatar"] = "" } // 推荐人信息 if o.ReferrerID != nil && *o.ReferrerID != "" { if u := userMap[*o.ReferrerID]; u != nil { m["referrerNickname"] = getStr(u.Nickname) m["referrerCode"] = getStr(u.ReferralCode) } } // 分销佣金:仅对已支付且存在推荐人的订单,按配置比例计算(与支付回调口径一致) status := getStr(o.Status) if status == "paid" && o.ReferrerID != nil && *o.ReferrerID != "" { m["referrerEarnings"] = o.Amount * distributorShare } else { m["referrerEarnings"] = nil } out = append(out, m) } c.JSON(http.StatusOK, gin.H{"success": true, "orders": out}) }