All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m54s
- 拆分订单创建为 CreateAdminOrder(后台一步支付)和 CreateH5Order(H5 两步支付) - 新增 CreateAdminOrderRequest DTO,后台仅允许 wallet/offline 支付方式 - 同步 delta specs 到主规格(order-payment 更新 + admin-order-creation 新增) - 归档 fix-agent-wallet-order-creation 变更 - 新增 implement-order-expiration 变更提案
156 lines
4.4 KiB
Go
156 lines
4.4 KiB
Go
package admin
|
||
|
||
import (
|
||
"strconv"
|
||
|
||
"github.com/go-playground/validator/v10"
|
||
"github.com/gofiber/fiber/v2"
|
||
|
||
"github.com/break/junhong_cmp_fiber/internal/model"
|
||
"github.com/break/junhong_cmp_fiber/internal/model/dto"
|
||
orderService "github.com/break/junhong_cmp_fiber/internal/service/order"
|
||
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
||
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
||
"github.com/break/junhong_cmp_fiber/pkg/middleware"
|
||
"github.com/break/junhong_cmp_fiber/pkg/response"
|
||
)
|
||
|
||
// OrderHandler 后台订单处理器
|
||
type OrderHandler struct {
|
||
service *orderService.Service
|
||
validator *validator.Validate
|
||
}
|
||
|
||
// NewOrderHandler 创建后台订单处理器
|
||
func NewOrderHandler(service *orderService.Service, validator *validator.Validate) *OrderHandler {
|
||
return &OrderHandler{service: service, validator: validator}
|
||
}
|
||
|
||
// Create 创建后台订单
|
||
// POST /api/admin/orders
|
||
func (h *OrderHandler) Create(c *fiber.Ctx) error {
|
||
var req dto.CreateAdminOrderRequest
|
||
if err := c.BodyParser(&req); err != nil {
|
||
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
|
||
}
|
||
|
||
// 验证请求参数(payment_method 必须为 wallet 或 offline)
|
||
if err := h.validator.Struct(&req); err != nil {
|
||
return errors.New(errors.CodeInvalidParam)
|
||
}
|
||
|
||
ctx := c.UserContext()
|
||
userType := middleware.GetUserTypeFromContext(ctx)
|
||
shopID := middleware.GetShopIDFromContext(ctx)
|
||
|
||
// 线下支付仅限平台用户
|
||
if req.PaymentMethod == model.PaymentMethodOffline {
|
||
if userType != constants.UserTypeSuperAdmin && userType != constants.UserTypePlatform {
|
||
return errors.New(errors.CodeForbidden, "只有平台可以使用线下支付")
|
||
}
|
||
} else if req.PaymentMethod == model.PaymentMethodWallet {
|
||
if userType != constants.UserTypeAgent && userType != constants.UserTypePlatform && userType != constants.UserTypeSuperAdmin {
|
||
return errors.New(errors.CodeForbidden, "无权创建订单")
|
||
}
|
||
} else {
|
||
// 防御性分支:DTO 验证已限制,此处兜底
|
||
return errors.New(errors.CodeInvalidParam, "后台仅支持钱包支付和线下支付")
|
||
}
|
||
|
||
buyerType := ""
|
||
buyerID := uint(0)
|
||
if userType == constants.UserTypeAgent {
|
||
buyerType = model.BuyerTypeAgent
|
||
buyerID = shopID
|
||
}
|
||
|
||
order, err := h.service.CreateAdminOrder(ctx, &req, buyerType, buyerID)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
return response.Success(c, order)
|
||
}
|
||
|
||
func (h *OrderHandler) Get(c *fiber.Ctx) error {
|
||
id, err := strconv.ParseUint(c.Params("id"), 10, 64)
|
||
if err != nil {
|
||
return errors.New(errors.CodeInvalidParam, "无效的订单ID")
|
||
}
|
||
|
||
order, err := h.service.Get(c.UserContext(), uint(id))
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
return response.Success(c, order)
|
||
}
|
||
|
||
func (h *OrderHandler) List(c *fiber.Ctx) error {
|
||
var req dto.OrderListRequest
|
||
if err := c.QueryParser(&req); err != nil {
|
||
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
|
||
}
|
||
|
||
ctx := c.UserContext()
|
||
userType := middleware.GetUserTypeFromContext(ctx)
|
||
shopID := middleware.GetShopIDFromContext(ctx)
|
||
|
||
var buyerType string
|
||
var buyerID uint
|
||
|
||
if userType == constants.UserTypeAgent {
|
||
buyerType = model.BuyerTypeAgent
|
||
buyerID = shopID
|
||
} else {
|
||
buyerType = ""
|
||
buyerID = 0
|
||
}
|
||
|
||
orders, err := h.service.List(ctx, &req, buyerType, buyerID)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
return response.Success(c, orders)
|
||
}
|
||
|
||
func (h *OrderHandler) Cancel(c *fiber.Ctx) error {
|
||
id, err := strconv.ParseUint(c.Params("id"), 10, 64)
|
||
if err != nil {
|
||
return errors.New(errors.CodeInvalidParam, "无效的订单ID")
|
||
}
|
||
|
||
ctx := c.UserContext()
|
||
userType := middleware.GetUserTypeFromContext(ctx)
|
||
shopID := middleware.GetShopIDFromContext(ctx)
|
||
|
||
if userType != constants.UserTypeAgent {
|
||
return errors.New(errors.CodeForbidden, "只有代理账号可以取消订单")
|
||
}
|
||
|
||
if err := h.service.Cancel(ctx, uint(id), model.BuyerTypeAgent, shopID); err != nil {
|
||
return err
|
||
}
|
||
|
||
return response.Success(c, nil)
|
||
}
|
||
|
||
// PurchaseCheck 代购订单预检接口
|
||
// 路由: POST /api/admin/orders/purchase-check
|
||
// 参数: order_type(订单类型), resource_id(资源ID), package_ids(套餐ID列表)
|
||
// 响应: 套餐总价、强充要求、实际支付金额等预检结果
|
||
func (h *OrderHandler) PurchaseCheck(c *fiber.Ctx) error {
|
||
var req dto.PurchaseCheckRequest
|
||
if err := c.BodyParser(&req); err != nil {
|
||
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
|
||
}
|
||
|
||
result, err := h.service.GetPurchaseCheck(c.UserContext(), &req)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
return response.Success(c, result)
|
||
}
|