From 825def88a4144af462188ab2c7c431020b07100e Mon Sep 17 00:00:00 2001 From: huang Date: Sat, 28 Mar 2026 11:33:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(03-01):=20Gateway=20SyncDeviceInfo=20?= =?UTF-8?q?=E6=96=B9=E6=B3=95=20+=20DTO=20=E5=AD=97=E6=AE=B5=E6=89=A9?= =?UTF-8?q?=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - gateway/models.go:新增 SyncDeviceInfoReq / SyncDeviceInfoResp 结构定义 - gateway/device.go:新增 SyncDeviceInfo() 方法,POST /device/sync-info - device_dto.go:DeviceResponse 新增 5 个 sync-info 同步字段;DeviceCardBindingResponse 新增 is_current - asset_dto.go:BoundCardInfo 新增 is_current 字段 --- internal/gateway/device.go | 12 +++++++++++- internal/gateway/models.go | 28 ++++++++++++++++++++++++++++ internal/model/dto/asset_dto.go | 13 +++++++++++-- internal/model/dto/device_dto.go | 7 +++++++ 4 files changed, 57 insertions(+), 3 deletions(-) diff --git a/internal/gateway/device.go b/internal/gateway/device.go index 84e9269..5fc1cb1 100644 --- a/internal/gateway/device.go +++ b/internal/gateway/device.go @@ -1,4 +1,4 @@ -// Package gateway 提供设备相关的 7 个 API 方法封装 +// Package gateway 提供设备相关的 8 个 API 方法封装 package gateway import ( @@ -68,3 +68,13 @@ func (c *Client) RebootDevice(ctx context.Context, req *DeviceOperationReq) erro _, err := c.doRequest(ctx, "/device/restart", req) return err } + +// SyncDeviceInfo 同步查询设备信息(直接返回,无需回调) +// 与异步 /device/info 的区别:直接返回全量数据,无需 callbackUrl +// POST /device/sync-info +func (c *Client) SyncDeviceInfo(ctx context.Context, req *SyncDeviceInfoReq) (*SyncDeviceInfoResp, error) { + if req.CardNo == "" { + return nil, errors.New(errors.CodeInvalidParam, "cardNo 不能为空") + } + return doRequestWithResponse[SyncDeviceInfoResp](c, ctx, "/device/sync-info", req) +} diff --git a/internal/gateway/models.go b/internal/gateway/models.go index 0037377..6ef7dae 100644 --- a/internal/gateway/models.go +++ b/internal/gateway/models.go @@ -131,3 +131,31 @@ type SlotInfoResp struct { Slots []SlotInfo `json:"slots" description:"卡槽信息列表"` Extend string `json:"extend,omitempty" description:"扩展字段(广电国网特殊参数)"` } + +// SyncDeviceInfoReq sync-info 同步查询设备信息请求 +// cardNo 规则:>15 位用 ICCID,=15 位用 IMEI,=11 位用 SN +type SyncDeviceInfoReq struct { + CardNo string `json:"card_no" description:"设备标识(ICCID/IMEI/SN)"` +} + +// SyncDeviceInfoResp sync-info 同步查询设备信息响应(对应 Gateway data 字段) +// 注意:所有字段均可能为 null/零值,表示暂无数据 +type SyncDeviceInfoResp struct { + DeviceID string `json:"device_id" description:"设备ID(IMEI/SN)"` + DeviceName string `json:"device_name" description:"设备名称"` + IMEI string `json:"imei" description:"IMEI号"` + CurrentIccid string `json:"current_iccid" description:"当前使用的ICCID"` + DeviceType string `json:"device_type" description:"设备类型:1=诺行,2=玺龙,3=迎势达"` + SoftwareVersion string `json:"software_version" description:"软件版本号"` + MacAddress string `json:"mac_address" description:"MAC地址"` + SSID string `json:"ssid" description:"WiFi热点名称"` + WifiEnabled bool `json:"wifi_enabled" description:"WiFi开关状态"` + SwitchMode string `json:"switch_mode" description:"切卡模式:0=自动,1=手动"` + RSSI string `json:"rssi" description:"接收信号强度"` + BatteryLevel *int `json:"battery_level" description:"电池电量百分比(无电池时为null)"` + OnlineStatus int `json:"online_status" description:"在线状态:1=在线,2=离线"` + LastUpdateTime string `json:"last_update_time" description:"设备信息最后更新时间(ISO 8601)"` + LastOnlineTime string `json:"last_online_time" description:"设备最后在线时间(ISO 8601)"` + RunTime string `json:"run_time" description:"本次开机运行时间(秒)"` + DailyUsage string `json:"daily_usage" description:"日使用流量(字节)"` +} diff --git a/internal/model/dto/asset_dto.go b/internal/model/dto/asset_dto.go index 3da072b..fc26e8b 100644 --- a/internal/model/dto/asset_dto.go +++ b/internal/model/dto/asset_dto.go @@ -59,8 +59,9 @@ type BoundCardInfo struct { ICCID string `json:"iccid" description:"ICCID"` MSISDN string `json:"msisdn,omitempty" description:"手机号"` NetworkStatus int `json:"network_status" description:"网络状态:0停机 1开机"` - RealNameStatus int `json:"real_name_status" description:"实名状态"` + RealNameStatus int `json:"real_name_status" description:"实名状态:0未实名 1已实名"` SlotPosition int `json:"slot_position,omitempty" description:"插槽位置"` + IsCurrent bool `json:"is_current" description:"是否为当前使用的卡"` } // AssetRealtimeStatusResponse 资产实时状态(只读DB/Redis) @@ -68,7 +69,7 @@ type AssetRealtimeStatusResponse struct { AssetType string `json:"asset_type" description:"资产类型:card 或 device"` AssetID uint `json:"asset_id" description:"资产ID"` NetworkStatus int `json:"network_status,omitempty" description:"网络状态(asset_type=card时有效):0停机 1开机"` - RealNameStatus int `json:"real_name_status,omitempty" description:"实名状态(asset_type=card时有效)"` + RealNameStatus int `json:"real_name_status,omitempty" description:"实名状态(asset_type=card时有效):0未实名 1已实名"` CurrentMonthUsageMB float64 `json:"current_month_usage_mb,omitempty" description:"本月已用流量MB(asset_type=card时有效)"` LastSyncTime *time.Time `json:"last_sync_time,omitempty" description:"最后同步时间(asset_type=card时有效)"` DeviceProtectStatus string `json:"device_protect_status,omitempty" description:"保护期状态(asset_type=device时有效):none/stop/start"` @@ -116,6 +117,14 @@ type AssetTypeIDRequest struct { ID uint `path:"id" description:"资产ID" required:"true"` } +// AssetPackagesRequest 资产套餐列表请求(路径参数 + 分页) +type AssetPackagesRequest struct { + AssetType string `path:"asset_type" description:"资产类型:card 或 device" required:"true"` + ID uint `path:"id" description:"资产ID" required:"true"` + Page int `query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码(默认1)"` + PageSize int `query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页条数(默认50,最大100)"` +} + // DeviceIDRequest 设备ID请求(路径参数) type DeviceIDRequest struct { DeviceID uint `path:"device_id" description:"设备ID" required:"true"` diff --git a/internal/model/dto/device_dto.go b/internal/model/dto/device_dto.go index 631edf9..c19045b 100644 --- a/internal/model/dto/device_dto.go +++ b/internal/model/dto/device_dto.go @@ -40,6 +40,12 @@ type DeviceResponse struct { ActivatedAt *time.Time `json:"activated_at,omitempty" description:"激活时间"` CreatedAt time.Time `json:"created_at" description:"创建时间"` UpdatedAt time.Time `json:"updated_at" description:"更新时间"` + // 设备实时同步字段(由 sync-info 接口写入) + OnlineStatus int `json:"online_status" description:"在线状态:0未知 1在线 2离线"` + LastOnlineTime *time.Time `json:"last_online_time,omitempty" description:"最后在线时间"` + SoftwareVersion string `json:"software_version" description:"固件版本号"` + SwitchMode string `json:"switch_mode" description:"切卡模式:0=自动,1=手动"` + LastGatewaySyncAt *time.Time `json:"last_gateway_sync_at,omitempty" description:"最后 sync-info 同步时间"` } type ListDeviceResponse struct { @@ -76,6 +82,7 @@ type DeviceCardBindingResponse struct { CarrierName string `json:"carrier_name,omitempty" description:"运营商名称"` Status int `json:"status" description:"卡状态 (1:在库, 2:已分销, 3:已激活, 4:已停用)"` BindTime *time.Time `json:"bind_time,omitempty" description:"绑定时间"` + IsCurrent bool `json:"is_current" description:"是否为当前使用的卡"` } type ListDeviceCardsResponse struct {