删除 miniprogram2 目录及其所有文件,包括项目配置、样式、图标和自定义组件,简化项目结构,专注于 miniprogram 目录的开发和维护。
This commit is contained in:
@@ -3,6 +3,9 @@ package handler
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"soul-api/internal/database"
|
||||
"soul-api/internal/model"
|
||||
@@ -10,16 +13,75 @@ import (
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// OrdersList GET /api/orders(带用户昵称/头像/手机号,分销佣金按配置比例计算)
|
||||
// OrdersList GET /api/orders(带用户昵称/头像/手机号,分销佣金按配置比例计算;支持分页 page、pageSize,筛选 status,搜索 search)
|
||||
func OrdersList(c *gin.Context) {
|
||||
db := database.DB()
|
||||
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
||||
pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10"))
|
||||
statusFilter := c.Query("status")
|
||||
search := strings.TrimSpace(c.Query("search"))
|
||||
if page < 1 {
|
||||
page = 1
|
||||
}
|
||||
if pageSize < 1 || pageSize > 100 {
|
||||
pageSize = 10
|
||||
}
|
||||
|
||||
q := db.Model(&model.Order{})
|
||||
if statusFilter != "" && statusFilter != "all" {
|
||||
if statusFilter == "completed" {
|
||||
q = q.Where("status IN ?", []string{"paid", "completed"})
|
||||
} else {
|
||||
q = q.Where("status = ?", statusFilter)
|
||||
}
|
||||
}
|
||||
if search != "" {
|
||||
pattern := "%" + search + "%"
|
||||
q = q.Where("order_sn LIKE ? OR id LIKE ? OR user_id IN (SELECT id FROM users WHERE COALESCE(nickname,'') LIKE ? OR COALESCE(phone,'') LIKE ? OR id LIKE ?)",
|
||||
pattern, pattern, pattern, pattern, pattern)
|
||||
}
|
||||
var total int64
|
||||
q.Count(&total)
|
||||
|
||||
var totalRevenue, todayRevenue float64
|
||||
db.Model(&model.Order{}).Select("COALESCE(SUM(amount), 0)").
|
||||
Where("status IN ?", []string{"paid", "completed"}).Scan(&totalRevenue)
|
||||
todayStart := time.Now().Truncate(24 * time.Hour)
|
||||
todayEnd := todayStart.Add(24 * time.Hour)
|
||||
db.Model(&model.Order{}).Select("COALESCE(SUM(amount), 0)").
|
||||
Where("status IN ? AND created_at >= ? AND created_at < ?", []string{"paid", "completed"}, todayStart, todayEnd).
|
||||
Scan(&todayRevenue)
|
||||
|
||||
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{}{}})
|
||||
query := db.Model(&model.Order{})
|
||||
if statusFilter != "" && statusFilter != "all" {
|
||||
if statusFilter == "completed" {
|
||||
query = query.Where("status IN ?", []string{"paid", "completed"})
|
||||
} else {
|
||||
query = query.Where("status = ?", statusFilter)
|
||||
}
|
||||
}
|
||||
if search != "" {
|
||||
pattern := "%" + search + "%"
|
||||
query = query.Where("order_sn LIKE ? OR id LIKE ? OR user_id IN (SELECT id FROM users WHERE COALESCE(nickname,'') LIKE ? OR COALESCE(phone,'') LIKE ? OR id LIKE ?)",
|
||||
pattern, pattern, pattern, pattern, pattern)
|
||||
}
|
||||
if err := query.Order("created_at DESC").
|
||||
Offset((page - 1) * pageSize).
|
||||
Limit(pageSize).
|
||||
Find(&orders).Error; err != nil {
|
||||
c.JSON(http.StatusOK, gin.H{"success": false, "error": err.Error(), "orders": []interface{}{}, "total": 0})
|
||||
return
|
||||
}
|
||||
totalPages := int(total) / pageSize
|
||||
if int(total)%pageSize > 0 {
|
||||
totalPages++
|
||||
}
|
||||
if len(orders) == 0 {
|
||||
c.JSON(http.StatusOK, gin.H{"success": true, "orders": []interface{}{}})
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"success": true, "orders": []interface{}{},
|
||||
"total": total, "page": page, "pageSize": pageSize, "totalPages": totalPages,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
@@ -97,5 +159,47 @@ func OrdersList(c *gin.Context) {
|
||||
}
|
||||
out = append(out, m)
|
||||
}
|
||||
c.JSON(http.StatusOK, gin.H{"success": true, "orders": out})
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"success": true, "orders": out,
|
||||
"total": total, "page": page, "pageSize": pageSize, "totalPages": totalPages,
|
||||
"totalRevenue": totalRevenue, "todayRevenue": todayRevenue,
|
||||
})
|
||||
}
|
||||
|
||||
// MiniprogramOrders GET /api/miniprogram/orders 小程序-当前用户订单列表(按 userId 过滤,返回 data)
|
||||
func MiniprogramOrders(c *gin.Context) {
|
||||
userID := c.Query("userId")
|
||||
if userID == "" {
|
||||
c.JSON(http.StatusOK, gin.H{"success": true, "data": []interface{}{}})
|
||||
return
|
||||
}
|
||||
db := database.DB()
|
||||
var orders []model.Order
|
||||
if err := db.Where("user_id = ?", userID).Order("created_at DESC").Find(&orders).Error; err != nil {
|
||||
c.JSON(http.StatusOK, gin.H{"success": true, "data": []interface{}{}})
|
||||
return
|
||||
}
|
||||
out := make([]gin.H, 0, len(orders))
|
||||
for _, o := range orders {
|
||||
desc := ""
|
||||
if o.Description != nil {
|
||||
desc = *o.Description
|
||||
}
|
||||
productID := ""
|
||||
if o.ProductID != nil {
|
||||
productID = *o.ProductID
|
||||
}
|
||||
status := "created"
|
||||
if o.Status != nil {
|
||||
status = *o.Status
|
||||
}
|
||||
out = append(out, gin.H{
|
||||
"id": o.ID, "order_sn": o.OrderSN, "user_id": o.UserID,
|
||||
"product_id": productID, "product_type": o.ProductType,
|
||||
"product_name": desc, "section_id": productID,
|
||||
"amount": o.Amount, "status": status,
|
||||
"created_at": o.CreatedAt,
|
||||
})
|
||||
}
|
||||
c.JSON(http.StatusOK, gin.H{"success": true, "data": out})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user