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