From c5ed040359eddeb48a847fe644a34cb8f26adecf Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 17 Apr 2026 17:32:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=90=8E=E5=8F=B0=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=20UpdateRealnameMode=20=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=B9=B6=E6=B3=A8=E5=86=8C=E8=B7=AF=E7=94=B1=20PATCH=20/api/ad?= =?UTF-8?q?min/assets/:identifier/realname-mode?= 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-openagent) Co-authored-by: Sisyphus --- internal/bootstrap/handlers.go | 2 +- internal/handler/admin/asset.go | 47 +++++++++++++++++++++++++++++++++ internal/routes/asset.go | 9 +++++++ 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/internal/bootstrap/handlers.go b/internal/bootstrap/handlers.go index 5c81348..dd4082f 100644 --- a/internal/bootstrap/handlers.go +++ b/internal/bootstrap/handlers.go @@ -119,7 +119,7 @@ func initHandlers(svc *services, deps *Dependencies) *Handlers { Asset: func() *admin.AssetHandler { pollingQueueMgr := pollingPkg.NewPollingQueueManager(deps.Redis, constants.PollingShardCount, deps.Logger) assetPollingSvc := pollingSvcPkg.NewAssetPollingService(deviceStore, deviceSimBindingStore, svc.IotCard, pollingQueueMgr, deps.Logger) - h := admin.NewAssetHandler(svc.Asset, svc.Device, svc.StopResumeService, assetPollingSvc) + h := admin.NewAssetHandler(svc.Asset, svc.Device, svc.IotCard, svc.StopResumeService, assetPollingSvc) h.SetLifecycleService(svc.AssetLifecycle) return h }(), diff --git a/internal/handler/admin/asset.go b/internal/handler/admin/asset.go index 40ca10d..790fef2 100644 --- a/internal/handler/admin/asset.go +++ b/internal/handler/admin/asset.go @@ -19,6 +19,7 @@ import ( type AssetHandler struct { assetService *assetService.Service deviceService *deviceService.Service + iotCardService *iotCardService.Service iotCardStopResume *iotCardService.StopResumeService assetPolling *pollingSvc.AssetPollingService assetLifecycleService AssetLifecycleService @@ -28,12 +29,14 @@ type AssetHandler struct { func NewAssetHandler( assetSvc *assetService.Service, deviceSvc *deviceService.Service, + iotCardSvc *iotCardService.Service, iotCardStopResume *iotCardService.StopResumeService, assetPolling *pollingSvc.AssetPollingService, ) *AssetHandler { return &AssetHandler{ assetService: assetSvc, deviceService: deviceSvc, + iotCardService: iotCardSvc, iotCardStopResume: iotCardStopResume, assetPolling: assetPolling, } @@ -283,3 +286,47 @@ func (h *AssetHandler) UpdatePollingStatus(c *fiber.Ctx) error { EnablePolling: req.EnablePolling, }) } + +// UpdateRealnamePolicy 更新资产实名认证策略 +// PATCH /api/admin/assets/:identifier/realname-mode +func (h *AssetHandler) UpdateRealnamePolicy(c *fiber.Ctx) error { + identifier := c.Params("identifier") + if identifier == "" { + return errors.New(errors.CodeInvalidParam) + } + + var req dto.UpdateAssetRealnamePolicyRequest + if err := c.BodyParser(&req); err != nil { + return errors.New(errors.CodeInvalidParam) + } + + if req.RealnamePolicy != constants.RealnamePolicyNone && + req.RealnamePolicy != constants.RealnamePolicyBeforeOrder && + req.RealnamePolicy != constants.RealnamePolicyAfterOrder { + return errors.New(errors.CodeInvalidParam, "无效的实名认证策略") + } + + asset, err := h.assetService.Resolve(c.UserContext(), identifier) + if err != nil { + return err + } + + switch asset.AssetType { + case "card": + if err := h.iotCardService.UpdateRealnamePolicy(c.UserContext(), asset.AssetID, req.RealnamePolicy); err != nil { + return err + } + case "device": + if err := h.deviceService.UpdateRealnamePolicy(c.UserContext(), asset.AssetID, req.RealnamePolicy); err != nil { + return err + } + default: + return errors.New(errors.CodeInvalidParam, "不支持的资产类型") + } + + return response.Success(c, &dto.UpdateAssetRealnamePolicyResponse{ + AssetType: asset.AssetType, + AssetID: asset.AssetID, + RealnamePolicy: req.RealnamePolicy, + }) +} diff --git a/internal/routes/asset.go b/internal/routes/asset.go index fa9cba0..653c363 100644 --- a/internal/routes/asset.go +++ b/internal/routes/asset.go @@ -118,4 +118,13 @@ func registerAssetRoutes(router fiber.Router, handler *admin.AssetHandler, walle Output: new(dto.UpdateAssetPollingStatusResponse), Auth: true, }) + + Register(assets, doc, groupPath, "PATCH", "/:identifier/realname-mode", handler.UpdateRealnamePolicy, RouteSpec{ + Summary: "更新资产实名认证策略", + Description: "更新指定资产(IoT卡或设备)的实名认证策略,支持 none/before_order/after_order 三种模式。", + Tags: []string{"资产管理"}, + Input: new(dto.UpdateAssetRealnamePolicyRequest), + Output: new(dto.UpdateAssetRealnamePolicyResponse), + Auth: true, + }) }