From d2b765327cc50da715ce160027ad66105c2ee5a7 Mon Sep 17 00:00:00 2001 From: huang Date: Sat, 21 Mar 2026 13:41:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=95=B4=E7=9A=84=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/handler/app/client_asset.go | 43 ++++++++-- internal/model/dto/client_asset_dto.go | 111 +++++++++++++++++++++++-- 2 files changed, 136 insertions(+), 18 deletions(-) diff --git a/internal/handler/app/client_asset.go b/internal/handler/app/client_asset.go index 798a015..b9917fb 100644 --- a/internal/handler/app/client_asset.go +++ b/internal/handler/app/client_asset.go @@ -149,15 +149,40 @@ func (h *ClientAssetHandler) GetAssetInfo(c *fiber.Ctx) error { } resp := &dto.AssetInfoResponse{ - AssetType: resolved.Asset.AssetType, - AssetID: resolved.Asset.AssetID, - Identifier: resolved.Identifier, - VirtualNo: resolved.Asset.VirtualNo, - Status: resolved.Asset.Status, - RealNameStatus: resolved.Asset.RealNameStatus, - CarrierName: resolved.Asset.CarrierName, - Generation: strconv.Itoa(resolved.Generation), - WalletBalance: resolved.WalletBalance, + AssetType: resolved.Asset.AssetType, + AssetID: resolved.Asset.AssetID, + Identifier: resolved.Identifier, + VirtualNo: resolved.Asset.VirtualNo, + Status: resolved.Asset.Status, + RealNameStatus: resolved.Asset.RealNameStatus, + CarrierName: resolved.Asset.CarrierName, + Generation: strconv.Itoa(resolved.Generation), + WalletBalance: resolved.WalletBalance, + ActivatedAt: resolved.Asset.ActivatedAt, + CurrentPackage: resolved.Asset.CurrentPackage, + PackageTotalMB: resolved.Asset.PackageTotalMB, + PackageUsedMB: resolved.Asset.PackageUsedMB, + PackageRemainMB: resolved.Asset.PackageRemainMB, + DeviceName: resolved.Asset.DeviceName, + IMEI: resolved.Asset.IMEI, + SN: resolved.Asset.SN, + DeviceModel: resolved.Asset.DeviceModel, + DeviceType: resolved.Asset.DeviceType, + Manufacturer: resolved.Asset.Manufacturer, + MaxSimSlots: resolved.Asset.MaxSimSlots, + BoundCardCount: resolved.Asset.BoundCardCount, + Cards: resolved.Asset.Cards, + DeviceProtectStatus: resolved.Asset.DeviceProtectStatus, + ICCID: resolved.Asset.ICCID, + MSISDN: resolved.Asset.MSISDN, + CarrierID: resolved.Asset.CarrierID, + CarrierType: resolved.Asset.CarrierType, + NetworkStatus: resolved.Asset.NetworkStatus, + ActivationStatus: resolved.Asset.ActivationStatus, + CardCategory: resolved.Asset.CardCategory, + BoundDeviceID: resolved.Asset.BoundDeviceID, + BoundDeviceNo: resolved.Asset.BoundDeviceNo, + BoundDeviceName: resolved.Asset.BoundDeviceName, } return response.Success(c, resp) diff --git a/internal/model/dto/client_asset_dto.go b/internal/model/dto/client_asset_dto.go index a663bf6..d90117f 100644 --- a/internal/model/dto/client_asset_dto.go +++ b/internal/model/dto/client_asset_dto.go @@ -1,5 +1,7 @@ package dto +import "time" + // ======================================== // B1 资产信息 // ======================================== @@ -10,16 +12,107 @@ type AssetInfoRequest struct { } // AssetInfoResponse B1 资产信息响应 +// 根据 asset_type 不同,设备专属字段或卡专属字段会分别填充(另一侧为零值/omit) type AssetInfoResponse struct { - AssetType string `json:"asset_type" description:"资产类型 (card:卡, device:设备)"` - AssetID uint `json:"asset_id" description:"资产ID"` - Identifier string `json:"identifier" description:"资产标识符"` - VirtualNo string `json:"virtual_no" description:"虚拟号"` - Status int `json:"status" description:"状态 (0:禁用, 1:启用)"` - RealNameStatus int `json:"real_name_status" description:"实名状态 (0:未实名, 1:已实名)"` - CarrierName string `json:"carrier_name" description:"运营商名称"` - Generation string `json:"generation" description:"制式"` - WalletBalance int64 `json:"wallet_balance" description:"钱包余额(分)"` + // === 基础信息(通用) === + AssetType string `json:"asset_type" description:"资产类型(card:卡, device:设备)"` + AssetID uint `json:"asset_id" description:"资产ID"` + Identifier string `json:"identifier" description:"资产标识符"` + VirtualNo string `json:"virtual_no" description:"虚拟号"` + Status int `json:"status" description:"状态(1:在库, 2:已分销, 3:已激活, 4:已停用)"` + RealNameStatus int `json:"real_name_status" description:"实名状态(0:未实名, 1:已实名)"` + CarrierName string `json:"carrier_name" description:"运营商名称"` + Generation string `json:"generation" description:"世代"` + WalletBalance int64 `json:"wallet_balance" description:"钱包余额(分)"` + ActivatedAt *time.Time `json:"activated_at,omitempty" description:"激活时间"` + + // === 套餐信息(通用) === + CurrentPackage string `json:"current_package" description:"当前套餐名称(无套餐时为空)"` + PackageTotalMB int64 `json:"package_total_mb" description:"当前套餐总虚流量(MB),已按虚流量比例换算"` + PackageUsedMB float64 `json:"package_used_mb" description:"当前已用虚流量(MB),已按虚流量比例换算"` + PackageRemainMB float64 `json:"package_remain_mb" description:"当前剩余虚流量(MB),已按虚流量比例换算"` + + // === 设备专属字段(asset_type=device 时有效) === + DeviceName string `json:"device_name,omitempty" description:"设备名称"` + IMEI string `json:"imei,omitempty" description:"设备IMEI"` + SN string `json:"sn,omitempty" description:"设备序列号"` + DeviceModel string `json:"device_model,omitempty" description:"设备型号"` + DeviceType string `json:"device_type,omitempty" description:"设备类型"` + Manufacturer string `json:"manufacturer,omitempty" description:"制造商"` + MaxSimSlots int `json:"max_sim_slots,omitempty" description:"最大插槽数"` + BoundCardCount int `json:"bound_card_count,omitempty" description:"绑定卡数量"` + Cards []BoundCardInfo `json:"cards,omitempty" description:"绑定卡列表(含每张卡的ICCID/MSISDN/网络状态/实名状态/插槽位置)"` + DeviceProtectStatus string `json:"device_protect_status,omitempty" description:"设备保护期状态(none:无, stop:停机保护, start:开机保护)"` + + // === 卡专属字段(asset_type=card 时有效) === + ICCID string `json:"iccid,omitempty" description:"卡ICCID"` + MSISDN string `json:"msisdn,omitempty" description:"手机号"` + CarrierID uint `json:"carrier_id,omitempty" description:"运营商ID"` + CarrierType string `json:"carrier_type,omitempty" description:"运营商类型(CMCC/CUCC/CTCC/CBN)"` + NetworkStatus int `json:"network_status,omitempty" description:"网络状态(0:停机, 1:开机)"` + ActivationStatus int `json:"activation_status,omitempty" description:"激活状态(0:未激活, 1:已激活)"` + CardCategory string `json:"card_category,omitempty" description:"卡业务类型(normal:普通卡, industry:行业卡)"` + + // === 卡绑定设备信息(asset_type=card 且绑定了设备时有效) === + BoundDeviceID *uint `json:"bound_device_id,omitempty" description:"绑定的设备ID"` + BoundDeviceNo string `json:"bound_device_no,omitempty" description:"绑定的设备虚拟号"` + BoundDeviceName string `json:"bound_device_name,omitempty" description:"绑定的设备名称"` + + // === 设备实时状态(来自 Gateway,同步接口对接后自动填充,当前返回 null) === + DeviceRealtime *DeviceRealtimeInfo `json:"device_realtime,omitempty" description:"设备实时状态(Gateway 同步接口对接后填充,当前为 null)"` +} + +// DeviceRealtimeInfo 设备实时状态信息 +// 全量映射 Gateway DeviceInfoDetail 结构,所有字段均为可选 +// 当前 Gateway 同步接口尚未对接,预留结构待后续填充 +type DeviceRealtimeInfo struct { + // === 设备状态 === + OnlineStatus *int64 `json:"online_status,omitempty" description:"在线状态(1:在线, 2:离线)"` + BatteryLevel *int64 `json:"battery_level,omitempty" description:"电池电量百分比"` + Status *int64 `json:"status,omitempty" description:"设备状态(1:正常, 0:禁用)"` + RunTime *string `json:"run_time,omitempty" description:"设备本次开机运行时间(秒)"` + ConnectTime *string `json:"connect_time,omitempty" description:"设备本次联网时间(秒)"` + LastOnlineTime *string `json:"last_online_time,omitempty" description:"设备最后在线时间"` + LastUpdateTime *string `json:"last_update_time,omitempty" description:"设备信息最后更新时间"` + + // === 信号相关 === + Rsrp *int64 `json:"rsrp,omitempty" description:"参考信号接收功率(dBm)"` + Rsrq *int64 `json:"rsrq,omitempty" description:"参考信号接收质量(dB)"` + Rssi *string `json:"rssi,omitempty" description:"接收信号强度"` + Sinr *int64 `json:"sinr,omitempty" description:"信噪比(dB)"` + + // === WiFi 相关 === + SSID *string `json:"ssid,omitempty" description:"WiFi热点名称"` + WifiEnabled *bool `json:"wifi_enabled,omitempty" description:"WiFi开关状态"` + WifiPassword *string `json:"wifi_password,omitempty" description:"WiFi密码"` + + // === 网络相关 === + IPAddress *string `json:"ip_address,omitempty" description:"IP地址"` + WANIP *string `json:"wan_ip,omitempty" description:"基站分配IPv4地址"` + LANIP *string `json:"lan_ip,omitempty" description:"局域网网关IP地址"` + MACAddress *string `json:"mac_address,omitempty" description:"MAC地址"` + + // === 流量与速率 === + DailyUsage *string `json:"daily_usage,omitempty" description:"日使用流量(字节)"` + DLStats *string `json:"dl_stats,omitempty" description:"本次开机下载流量(字节)"` + ULStats *string `json:"ul_stats,omitempty" description:"本次开机上传流量(字节)"` + LimitSpeed *int64 `json:"limit_speed,omitempty" description:"限速速率(KB/s)"` + + // === 设备属性 === + CurrentIccid *string `json:"current_iccid,omitempty" description:"当前使用的ICCID"` + MaxClients *int64 `json:"max_clients,omitempty" description:"最大连接客户端数"` + SoftwareVersion *string `json:"software_version,omitempty" description:"软件版本号"` + SwitchMode *int `json:"switch_mode,omitempty" description:"切卡模式(0:自动, 1:手动)"` + SyncInterval *int64 `json:"sync_interval,omitempty" description:"信息上报周期(秒)"` + + // === Gateway 原始标识字段 === + DeviceID *string `json:"device_id,omitempty" description:"Gateway设备ID(IMEI/SN)"` + DeviceName *string `json:"device_name,omitempty" description:"Gateway返回的设备名称"` + DeviceType *string `json:"device_type,omitempty" description:"Gateway返回的设备型号"` + Imei *string `json:"imei,omitempty" description:"Gateway返回的IMEI号"` + Imsi *string `json:"imsi,omitempty" description:"Gateway返回的IMSI"` + CreatedAt *int64 `json:"created_at,omitempty" description:"Gateway创建时间(Unix时间戳)"` + UpdatedAt *int64 `json:"updated_at,omitempty" description:"Gateway更新时间(Unix时间戳)"` } // ========================================