102 lines
2.7 KiB
Go
102 lines
2.7 KiB
Go
|
|
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})
|
|||
|
|
}
|