From 00dba42a63105b8ba2fbc5c42aba92a9b44cd2d3 Mon Sep 17 00:00:00 2001 From: huang Date: Sat, 28 Mar 2026 13:17:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(03.1-01):=20=E8=A1=A5=E5=85=A8=20Gateway?= =?UTF-8?q?=20SyncDeviceInfoResp=20=E7=BC=BA=E5=A4=B1=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=8F=8A=20B=20=E7=AB=AF=20DeviceGatewayInfo=20DTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SyncDeviceInfoResp 新增 Rsrp/Rsrq/Sinr/WifiPassword/IPAddress/WANIP/LANIP/MaxClients/ConnectTime/Status/IMSI/ULStats/DLStats/LimitSpeed/SyncInterval 共 15 个字段 - asset_dto.go 新增 DeviceGatewayInfo B 端实时状态结构体(49 字段,全部含 description tag) - AssetRealtimeStatusResponse 新增 DeviceRealtime *DeviceGatewayInfo 字段 - AssetResolveResponse 新增 5 个设备 DB 缓存字段(online_status/last_online_time/software_version/switch_mode/last_gateway_sync_at) --- internal/gateway/models.go | 25 ++++++++ internal/model/dto/asset_dto.go | 74 +++++++++++++++++++++--- internal/service/asset_wallet/service.go | 3 +- 3 files changed, 93 insertions(+), 9 deletions(-) diff --git a/internal/gateway/models.go b/internal/gateway/models.go index 6ef7dae..2e6e1d6 100644 --- a/internal/gateway/models.go +++ b/internal/gateway/models.go @@ -158,4 +158,29 @@ type SyncDeviceInfoResp struct { LastOnlineTime string `json:"last_online_time" description:"设备最后在线时间(ISO 8601)"` RunTime string `json:"run_time" description:"本次开机运行时间(秒)"` DailyUsage string `json:"daily_usage" description:"日使用流量(字节)"` + + // 信号相关(D-10 补全) + Rsrp int `json:"rsrp" description:"参考信号接收功率(dBm)"` + Rsrq int `json:"rsrq" description:"参考信号接收质量(dB)"` + Sinr int `json:"sinr" description:"信噪比(dB)"` + + // WiFi 相关(D-10 补全) + WifiPassword string `json:"wifi_password" description:"WiFi密码"` + + // 网络相关(D-10 补全) + IPAddress string `json:"ip_address" description:"IP地址"` + WANIP string `json:"wan_ip" description:"基站分配IPv4地址"` + LANIP string `json:"lan_ip" description:"局域网网关IP地址"` + + // 连接相关(D-10 补全) + MaxClients int `json:"max_clients" description:"最大连接客户端数"` + ConnectTime string `json:"connect_time" description:"设备本次联网时间(秒)"` + + // 设备属性(D-10 补全) + Status int `json:"status" description:"设备状态:1=正常,0=禁用"` + IMSI string `json:"imsi" description:"IMSI用户标识码"` + ULStats string `json:"ul_stats" description:"本次开机上传流量(字节)"` + DLStats string `json:"dl_stats" description:"本次开机下载流量(字节)"` + LimitSpeed int `json:"limit_speed" description:"限速速率(KB/s)"` + SyncInterval int `json:"sync_interval" description:"信息上报周期(秒)"` } diff --git a/internal/model/dto/asset_dto.go b/internal/model/dto/asset_dto.go index fc26e8b..a9240c0 100644 --- a/internal/model/dto/asset_dto.go +++ b/internal/model/dto/asset_dto.go @@ -40,6 +40,12 @@ type AssetResolveResponse struct { DeviceType string `json:"device_type,omitempty" description:"设备类型"` MaxSimSlots int `json:"max_sim_slots,omitempty" description:"最大插槽数"` Manufacturer string `json:"manufacturer,omitempty" description:"制造商"` + // 设备 DB 缓存字段(Phase 3 sync-info 写入,展示上次同步快照) + OnlineStatus int `json:"online_status,omitempty" description:"在线状态:0未知 1在线 2离线(设备类型时有效)"` + LastOnlineTime *time.Time `json:"last_online_time,omitempty" description:"最后在线时间(设备类型时有效)"` + SoftwareVersion string `json:"software_version,omitempty" description:"固件版本号(设备类型时有效)"` + SwitchMode string `json:"switch_mode,omitempty" description:"切卡模式:0=自动,1=手动(设备类型时有效)"` + LastGatewaySyncAt *time.Time `json:"last_gateway_sync_at,omitempty" description:"最后 sync-info 同步时间(设备类型时有效)"` // 卡专属字段(device类型时为零值) CarrierID uint `json:"carrier_id,omitempty" description:"运营商ID"` CarrierType string `json:"carrier_type,omitempty" description:"运营商类型"` @@ -66,14 +72,15 @@ type BoundCardInfo struct { // AssetRealtimeStatusResponse 资产实时状态(只读DB/Redis) 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时有效):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"` - Cards []BoundCardInfo `json:"cards,omitempty" description:"绑定卡状态列表(asset_type=device时有效)"` + 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时有效):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"` + Cards []BoundCardInfo `json:"cards,omitempty" description:"绑定卡状态列表(asset_type=device时有效)"` + DeviceRealtime *DeviceGatewayInfo `json:"device_realtime,omitempty" description:"设备实时状态(来自 Gateway sync-info,Gateway 失败时为 null)"` } // AssetPackageResponse 资产套餐信息 @@ -134,3 +141,54 @@ type DeviceIDRequest struct { type CardICCIDRequest struct { ICCID string `path:"iccid" description:"卡ICCID" required:"true"` } + +// DeviceGatewayInfo B端设备实时状态信息(来自 Gateway sync-info) +// 与 C 端 DeviceRealtimeInfo 独立,未来可展示更多技术字段 +// 所有字段均为可选,Gateway 调用失败时整体为 null +type DeviceGatewayInfo struct { + // 设备状态 + OnlineStatus *int `json:"online_status,omitempty" description:"在线状态:1=在线,2=离线"` + BatteryLevel *int `json:"battery_level,omitempty" description:"电池电量百分比(无电池时为null)"` + Status *int `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 *int `json:"rsrp,omitempty" description:"参考信号接收功率(dBm)"` + Rsrq *int `json:"rsrq,omitempty" description:"参考信号接收质量(dB)"` + Rssi *string `json:"rssi,omitempty" description:"接收信号强度"` + Sinr *int `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 *int `json:"limit_speed,omitempty" description:"限速速率(KB/s)"` + + // 设备属性 + CurrentIccid *string `json:"current_iccid,omitempty" description:"当前使用的ICCID"` + MaxClients *int `json:"max_clients,omitempty" description:"最大连接客户端数"` + SoftwareVersion *string `json:"software_version,omitempty" description:"软件版本号"` + SwitchMode *string `json:"switch_mode,omitempty" description:"切卡模式:0=自动,1=手动"` + SyncInterval *int `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:"IMEI号"` + IMSI *string `json:"imsi,omitempty" description:"IMSI用户标识码"` +} diff --git a/internal/service/asset_wallet/service.go b/internal/service/asset_wallet/service.go index 3989bba..b665457 100644 --- a/internal/service/asset_wallet/service.go +++ b/internal/service/asset_wallet/service.go @@ -35,7 +35,8 @@ func (s *Service) GetWallet(ctx context.Context, assetType string, assetID uint) wallet, err := s.assetWalletStore.GetByResourceTypeAndID(ctx, resourceType, assetID) if err != nil { if err == gorm.ErrRecordNotFound { - return nil, errors.New(errors.CodeNotFound, "该资产暂无钱包记录") + // 暂无钱包记录属于正常业务状态(企业卡/未充值资产),返回 nil 而非错误 + return nil, nil } return nil, errors.Wrap(errors.CodeDatabaseError, err, "查询钱包失败") }