Files
shangbangbang/internal/handlers/admin_order_message_handler.go
solosw 99b11b04e4 1.0
2026-01-05 14:11:34 +08:00

184 lines
4.9 KiB
Go

package handlers
import (
"awesomeProject/internal/common"
"awesomeProject/internal/models"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
// AdminOrderMessageHandler 管理端订单留言处理器
type AdminOrderMessageHandler struct{}
// GetOrderMessages 获取订单留言列表
func (h *AdminOrderMessageHandler) GetOrderMessages(c *gin.Context) {
orderID, err := strconv.ParseUint(c.Param("order_id"), 10, 32)
if err != nil {
c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
return
}
orderType := c.Query("type") // purchase 或 sales
if orderType == "" {
c.JSON(http.StatusOK, common.Error(400, "订单类型无效"))
return
}
currentUser, _ := c.Get("current_user")
user := currentUser.(models.User)
// 验证管理员权限
if user.SystemRole != 0 && user.SystemRole != 1 {
c.JSON(http.StatusOK, common.Error(403, "权限不足"))
return
}
// 分页参数
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
if page < 1 {
page = 1
}
if pageSize < 1 || pageSize > 50 {
pageSize = 20
}
db := common.GetDB()
var messages []models.OrderMessage
var total int64
// 如果是买单,需要同时查询买单和对应卖单的留言
var query *gorm.DB
if orderType == "purchase" {
// 查找是否有对应的卖单
var salesOrder models.SalesOrder
err := db.Where("purchase_order_id = ?", orderID).First(&salesOrder).Error
if err == nil {
// 有对应卖单,查询两个订单的留言
query = db.Model(&models.OrderMessage{}).
Where("(order_id = ? AND order_type = ?) OR (order_id = ? AND order_type = ?)",
orderID, "purchase", salesOrder.ID, "sales")
} else {
// 没有对应卖单,只查询买单留言
query = db.Model(&models.OrderMessage{}).
Where("order_id = ? AND order_type = ?", orderID, "purchase")
}
} else {
// 卖单,查询卖单和对应买单的留言
var salesOrder models.SalesOrder
err := db.Where("id = ?", orderID).First(&salesOrder).Error
if err != nil {
c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
return
}
query = db.Model(&models.OrderMessage{}).
Where("(order_id = ? AND order_type = ?) OR (order_id = ? AND order_type = ?)",
salesOrder.ID, "sales", salesOrder.PurchaseOrderID, "purchase")
}
query = query.Preload("User", func(db *gorm.DB) *gorm.DB {
return db.Select("id, customer_name, real_name, phone, system_role")
})
// 获取总数
query.Count(&total)
// 分页查询
offset := (page - 1) * pageSize
err = query.Order("created_at ASC").Offset(offset).Limit(pageSize).Find(&messages).Error
if err != nil {
c.JSON(http.StatusOK, common.Error(500, "查询留言列表失败"))
return
}
// 构建返回数据
result := map[string]interface{}{
"list": messages,
"total": total,
"page": page,
"page_size": pageSize,
}
c.JSON(http.StatusOK, common.Success(result))
}
// CreateOrderMessage 创建订单留言
func (h *AdminOrderMessageHandler) CreateOrderMessage(c *gin.Context) {
orderID, err := strconv.ParseUint(c.Param("order_id"), 10, 32)
if err != nil {
c.JSON(http.StatusOK, common.Error(400, "订单ID无效"))
return
}
orderType := c.Query("type") // purchase 或 sales
if orderType == "" {
c.JSON(http.StatusOK, common.Error(400, "订单类型无效"))
return
}
currentUser, _ := c.Get("current_user")
user := currentUser.(models.User)
// 验证管理员权限
if user.SystemRole != 0 && user.SystemRole != 1 {
c.JSON(http.StatusOK, common.Error(403, "权限不足"))
return
}
var req struct {
Content string `json:"content" binding:"required"`
Images string `json:"images"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusOK, common.Error(400, "请求参数错误"))
return
}
// 验证留言内容
if len(req.Content) > 500 {
c.JSON(http.StatusOK, common.Error(400, "留言内容不能超过500字"))
return
}
// 验证订单是否存在
db := common.GetDB()
if orderType == "purchase" {
var order models.PurchaseOrder
if err := db.First(&order, uint(orderID)).Error; err != nil {
c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
return
}
} else {
var order models.SalesOrder
if err := db.First(&order, uint(orderID)).Error; err != nil {
c.JSON(http.StatusOK, common.Error(404, "订单不存在"))
return
}
}
// 创建留言记录
message := models.OrderMessage{
OrderID: uint(orderID),
OrderType: orderType,
UserID: user.ID,
Content: req.Content,
Images: req.Images,
}
if err := db.Create(&message).Error; err != nil {
c.JSON(http.StatusOK, common.Error(500, "创建留言失败"))
return
}
// 预加载用户信息
db.Preload("User", func(db *gorm.DB) *gorm.DB {
return db.Select("id, customer_name, real_name, phone, system_role")
}).First(&message, message.ID)
c.JSON(http.StatusOK, common.Success(message))
}