238 lines
6.1 KiB
Go
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)
|
|
}
|