From 760b3db1df7758bba37e20b2ec0efe6947477f24 Mon Sep 17 00:00:00 2001 From: huang Date: Sat, 31 Jan 2026 12:14:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(h5):=20=E6=96=B0=E5=A2=9E=E5=85=85?= =?UTF-8?q?=E5=80=BC=E8=AE=A2=E5=8D=95=E5=A4=84=E7=90=86=E5=99=A8=E5=92=8C?= =?UTF-8?q?=20DTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现 RechargeHandler 处理充值订单创建、预检、查询等接口 - 添加充值相关 DTO(CreateRechargeRequest、RechargeCheckRequest 等) - 支持充值预检(强充检查、金额限制等) - 支持充值订单列表和详情查询 --- internal/handler/h5/recharge.go | 169 ++++++++++++++++++++++++++++++++ internal/model/dto/recharge.go | 5 + 2 files changed, 174 insertions(+) create mode 100644 internal/handler/h5/recharge.go diff --git a/internal/handler/h5/recharge.go b/internal/handler/h5/recharge.go new file mode 100644 index 0000000..678907c --- /dev/null +++ b/internal/handler/h5/recharge.go @@ -0,0 +1,169 @@ +package h5 + +import ( + "strconv" + + "github.com/gofiber/fiber/v2" + + "github.com/break/junhong_cmp_fiber/internal/model/dto" + rechargeService "github.com/break/junhong_cmp_fiber/internal/service/recharge" + "github.com/break/junhong_cmp_fiber/pkg/errors" + "github.com/break/junhong_cmp_fiber/pkg/middleware" + "github.com/break/junhong_cmp_fiber/pkg/response" +) + +// RechargeHandler 充值订单处理器 +// 提供充值订单的创建、预检、查询等接口 +type RechargeHandler struct { + service *rechargeService.Service +} + +// NewRechargeHandler 创建充值订单处理器实例 +// 参数: +// - service: 充值服务 +// +// 返回: +// - *RechargeHandler: 充值订单处理器实例 +func NewRechargeHandler(service *rechargeService.Service) *RechargeHandler { + return &RechargeHandler{service: service} +} + +// Create 创建充值订单 +// POST /api/h5/wallets/recharge +// 请求参数: +// - resource_type: 资源类型(iot_card/device) +// - resource_id: 资源ID(卡ID或设备ID) +// - amount: 充值金额(分) +// - payment_method: 支付方式(wechat/alipay) +// +// 响应: +// - 成功: 返回充值订单信息(订单ID、订单号、金额、状态等) +// - 失败: 返回错误信息 +func (h *RechargeHandler) Create(c *fiber.Ctx) error { + var req dto.CreateRechargeRequest + if err := c.BodyParser(&req); err != nil { + return errors.New(errors.CodeInvalidParam, "请求参数解析失败") + } + + ctx := c.UserContext() + // 获取个人客户ID作为用户ID + userID := middleware.GetCustomerIDFromContext(ctx) + if userID == 0 { + return errors.New(errors.CodeUnauthorized, "用户未登录") + } + + result, err := h.service.Create(ctx, &req, userID) + if err != nil { + return err + } + + return response.Success(c, result) +} + +// RechargeCheck 充值预检 +// GET /api/h5/wallets/recharge-check +// 请求参数: +// - resource_type: 资源类型(iot_card/device) +// - resource_id: 资源ID(卡ID或设备ID) +// +// 响应: +// - 成功: 返回预检信息(是否需要强充、强充金额、最小/最大充值金额等) +// - 失败: 返回错误信息 +func (h *RechargeHandler) RechargeCheck(c *fiber.Ctx) error { + var req dto.RechargeCheckRequest + if err := c.QueryParser(&req); err != nil { + return errors.New(errors.CodeInvalidParam, "请求参数解析失败") + } + + // 验证必填参数 + if req.ResourceType == "" { + return errors.New(errors.CodeInvalidParam, "资源类型不能为空") + } + if req.ResourceID == 0 { + return errors.New(errors.CodeInvalidParam, "资源ID不能为空") + } + + ctx := c.UserContext() + result, err := h.service.GetRechargeCheck(ctx, req.ResourceType, req.ResourceID) + if err != nil { + return err + } + + // 转换为 DTO 响应 + resp := &dto.RechargeCheckResponse{ + NeedForceRecharge: result.NeedForceRecharge, + ForceRechargeAmount: result.ForceRechargeAmount, + TriggerType: result.TriggerType, + MinAmount: result.MinAmount, + MaxAmount: result.MaxAmount, + CurrentAccumulated: result.CurrentAccumulated, + Threshold: result.Threshold, + Message: result.Message, + FirstCommissionPaid: result.FirstCommissionPaid, + } + + return response.Success(c, resp) +} + +// List 查询充值订单列表 +// GET /api/h5/wallets/recharges +// 请求参数: +// - page: 页码(从1开始,默认1) +// - page_size: 每页数量(默认20,最大100) +// - wallet_id: 钱包ID筛选(可选) +// - status: 状态筛选(可选,1-待支付 2-已支付 3-已完成 4-已关闭 5-已退款) +// - start_time: 开始时间筛选(可选) +// - end_time: 结束时间筛选(可选) +// +// 响应: +// - 成功: 返回充值订单列表(分页数据、总记录数、总页数) +// - 失败: 返回错误信息 +func (h *RechargeHandler) List(c *fiber.Ctx) error { + var req dto.RechargeListRequest + if err := c.QueryParser(&req); err != nil { + return errors.New(errors.CodeInvalidParam, "请求参数解析失败") + } + + ctx := c.UserContext() + // 获取个人客户ID作为用户ID + userID := middleware.GetCustomerIDFromContext(ctx) + if userID == 0 { + return errors.New(errors.CodeUnauthorized, "用户未登录") + } + + result, err := h.service.List(ctx, &req, userID) + if err != nil { + return err + } + + return response.Success(c, result) +} + +// Get 查询充值订单详情 +// GET /api/h5/wallets/recharges/:id +// 路径参数: +// - id: 充值订单ID +// +// 响应: +// - 成功: 返回充值订单详情(订单ID、订单号、金额、状态、支付信息等) +// - 失败: 返回错误信息 +func (h *RechargeHandler) Get(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() + // 获取个人客户ID作为用户ID + userID := middleware.GetCustomerIDFromContext(ctx) + if userID == 0 { + return errors.New(errors.CodeUnauthorized, "用户未登录") + } + + result, err := h.service.GetByID(ctx, uint(id), userID) + if err != nil { + return err + } + + return response.Success(c, result) +} diff --git a/internal/model/dto/recharge.go b/internal/model/dto/recharge.go index e7a233f..0196135 100644 --- a/internal/model/dto/recharge.go +++ b/internal/model/dto/recharge.go @@ -105,3 +105,8 @@ type RechargeCheckResponse struct { // 一次性佣金是否已发放 FirstCommissionPaid bool `json:"first_commission_paid" description:"一次性佣金是否已发放"` } + +// GetRechargeRequest 获取充值订单详情请求 +type GetRechargeRequest struct { + ID uint `path:"id" description:"充值订单ID" required:"true"` +}