From 9b83f92fb6dab60d8627b27ad9062d86b784636b Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 16 Mar 2026 15:43:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20AssetWallet=20Hand?= =?UTF-8?q?ler=EF=BC=8C=E5=AE=9E=E7=8E=B0=E8=B5=84=E4=BA=A7=E9=92=B1?= =?UTF-8?q?=E5=8C=85=20API=20=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus --- internal/handler/admin/asset_wallet.go | 88 ++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 internal/handler/admin/asset_wallet.go diff --git a/internal/handler/admin/asset_wallet.go b/internal/handler/admin/asset_wallet.go new file mode 100644 index 0000000..19a7643 --- /dev/null +++ b/internal/handler/admin/asset_wallet.go @@ -0,0 +1,88 @@ +package admin + +import ( + "strconv" + + "github.com/gofiber/fiber/v2" + + "github.com/break/junhong_cmp_fiber/internal/model/dto" + assetWalletSvc "github.com/break/junhong_cmp_fiber/internal/service/asset_wallet" + "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" +) + +// AssetWalletHandler 资产钱包处理器 +// 提供管理端资产(卡/设备)钱包概况和流水查询接口 +type AssetWalletHandler struct { + service *assetWalletSvc.Service +} + +// NewAssetWalletHandler 创建资产钱包处理器 +func NewAssetWalletHandler(svc *assetWalletSvc.Service) *AssetWalletHandler { + return &AssetWalletHandler{service: svc} +} + +// GetWallet 查询资产钱包概况 +// GET /api/admin/assets/:asset_type/:id/wallet +func (h *AssetWalletHandler) GetWallet(c *fiber.Ctx) error { + userType := middleware.GetUserTypeFromContext(c.UserContext()) + if userType == constants.UserTypeEnterprise { + return errors.New(errors.CodeForbidden, "企业账号无权查看钱包信息") + } + + assetType := c.Params("asset_type") + if assetType != "card" && assetType != "device" { + return errors.New(errors.CodeInvalidParam, "无效的资产类型") + } + + idStr := c.Params("id") + id, err := strconv.ParseUint(idStr, 10, 64) + if err != nil || id == 0 { + return errors.New(errors.CodeInvalidParam, "无效的资产ID") + } + + result, err := h.service.GetWallet(c.UserContext(), assetType, uint(id)) + if err != nil { + return err + } + + return response.Success(c, result) +} + +// ListTransactions 查询资产钱包流水列表 +// GET /api/admin/assets/:asset_type/:id/wallet/transactions +func (h *AssetWalletHandler) ListTransactions(c *fiber.Ctx) error { + userType := middleware.GetUserTypeFromContext(c.UserContext()) + if userType == constants.UserTypeEnterprise { + return errors.New(errors.CodeForbidden, "企业账号无权查看钱包信息") + } + + assetType := c.Params("asset_type") + if assetType != "card" && assetType != "device" { + return errors.New(errors.CodeInvalidParam, "无效的资产类型") + } + + idStr := c.Params("id") + id, err := strconv.ParseUint(idStr, 10, 64) + if err != nil || id == 0 { + return errors.New(errors.CodeInvalidParam, "无效的资产ID") + } + + var req dto.AssetWalletTransactionListRequest + if err := c.QueryParser(&req); err != nil { + return errors.New(errors.CodeInvalidParam) + } + + if req.PageSize > 100 { + return errors.New(errors.CodeInvalidParam, "每页数量不能超过100") + } + + result, err := h.service.ListTransactions(c.UserContext(), assetType, uint(id), &req) + if err != nil { + return err + } + + return response.Success(c, result) +}