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)) }