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