duidui_fiber/internal/order/handler/order_handler.go
2026-03-27 10:34:03 +08:00

238 lines
6.1 KiB
Go

package handler
import (
"dd_fiber_api/internal/order"
"dd_fiber_api/internal/order/service"
"strconv"
"github.com/gofiber/fiber/v2"
)
// OrderHandler 订单处理器
type OrderHandler struct {
orderService *service.OrderService
}
// NewOrderHandler 创建订单处理器
func NewOrderHandler(orderService *service.OrderService) *OrderHandler {
return &OrderHandler{
orderService: orderService,
}
}
// CreateOrder 创建订单
func (h *OrderHandler) CreateOrder(c *fiber.Ctx) error {
var req order.CreateOrderRequest
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "请求参数解析失败: " + err.Error(),
})
}
if req.UserID == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "用户ID不能为空",
})
}
if req.CampID == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "打卡营ID不能为空",
})
}
if req.SectionID == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "小节ID不能为空",
})
}
resp, err := h.orderService.CreateOrder(c.Context(), &req)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": "创建订单失败: " + err.Error(),
})
}
if !resp.Success {
return c.Status(fiber.StatusBadRequest).JSON(resp)
}
return c.Status(fiber.StatusOK).JSON(resp)
}
// GetOrder 获取订单详情
func (h *OrderHandler) GetOrder(c *fiber.Ctx) error {
var req order.GetOrderRequest
if err := c.QueryParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "请求参数解析失败: " + err.Error(),
})
}
if req.OrderID == "" && req.OrderNo == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "订单ID和订单号至少需要提供一个",
})
}
resp, err := h.orderService.GetOrder(req.OrderID, req.OrderNo)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": "获取订单失败: " + err.Error(),
})
}
if !resp.Success {
return c.Status(fiber.StatusNotFound).JSON(resp)
}
return c.Status(fiber.StatusOK).JSON(resp)
}
// ListOrders 查询订单列表
func (h *OrderHandler) ListOrders(c *fiber.Ctx) error {
var req order.ListOrdersRequest
if err := c.QueryParser(&req); err != nil {
req.Page = 1
req.PageSize = 20
}
// 解析 OrderStatus
orderStatusStr := c.Query("order_status")
if orderStatusStr != "" {
if orderStatusInt, err := strconv.Atoi(orderStatusStr); err == nil {
req.OrderStatus = order.OrderStatus(orderStatusInt)
}
}
// 解析 PaymentMethod
paymentMethodStr := c.Query("payment_method")
if paymentMethodStr != "" {
if paymentMethodInt, err := strconv.Atoi(paymentMethodStr); err == nil {
req.PaymentMethod = order.PaymentMethod(paymentMethodInt)
}
}
resp, err := h.orderService.ListOrders(&req)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": "查询订单列表失败: " + err.Error(),
})
}
return c.Status(fiber.StatusOK).JSON(resp)
}
// UpdateOrderStatus 更新订单状态
func (h *OrderHandler) UpdateOrderStatus(c *fiber.Ctx) error {
var req order.UpdateOrderStatusRequest
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "请求参数解析失败: " + err.Error(),
})
}
if req.OrderID == "" && req.OrderNo == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "订单ID和订单号至少需要提供一个",
})
}
resp, err := h.orderService.UpdateOrderStatus(&req)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": "更新订单状态失败: " + err.Error(),
})
}
if !resp.Success {
return c.Status(fiber.StatusBadRequest).JSON(resp)
}
return c.Status(fiber.StatusOK).JSON(resp)
}
// CancelOrder 取消订单
func (h *OrderHandler) CancelOrder(c *fiber.Ctx) error {
var req order.CancelOrderRequest
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "请求参数解析失败: " + err.Error(),
})
}
if req.OrderID == "" && req.OrderNo == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "订单ID和订单号至少需要提供一个",
})
}
resp, err := h.orderService.CancelOrder(&req)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": "取消订单失败: " + err.Error(),
})
}
if !resp.Success {
return c.Status(fiber.StatusBadRequest).JSON(resp)
}
return c.Status(fiber.StatusOK).JSON(resp)
}
// AutoCancelOrder 自动关闭订单(用于定时任务回调)
func (h *OrderHandler) AutoCancelOrder(c *fiber.Ctx) error {
orderID := c.Query("order_id")
if orderID == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "订单ID不能为空",
})
}
// 查询订单当前状态
orderObj, err := h.orderService.GetOrder(orderID, "")
if err != nil || orderObj == nil || !orderObj.Success {
return c.Status(fiber.StatusOK).JSON(fiber.Map{
"success": false,
"message": "订单不存在或已处理",
})
}
// 如果订单已经是最终状态(已支付、已取消、已退款等),不需要再次关闭
if orderObj.Order.Status != order.OrderStatusPending {
return c.Status(fiber.StatusOK).JSON(fiber.Map{
"success": true,
"message": "订单状态已变更,无需关闭",
})
}
// 关闭订单
resp, err := h.orderService.CancelOrder(&order.CancelOrderRequest{
OrderID: orderID,
})
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": "关闭订单失败: " + err.Error(),
})
}
return c.Status(fiber.StatusOK).JSON(resp)
}