package dto import "time" // AssetResolveResponse 统一资产解析响应 type AssetResolveResponse struct { AssetType string `json:"asset_type" description:"资产类型:card 或 device"` AssetID uint `json:"asset_id" description:"资产数据库ID"` Identifier string `json:"identifier,omitempty" description:"解析时使用的标识符"` VirtualNo string `json:"virtual_no" description:"虚拟号"` Status int `json:"status" description:"资产状态 (1:在库, 2:已分销, 3:已激活, 4:已停用)"` StatusName string `json:"status_name" description:"资产状态名称(中文)"` BatchNo string `json:"batch_no" description:"批次号"` ShopID *uint `json:"shop_id,omitempty" description:"所属店铺ID"` ShopName string `json:"shop_name,omitempty" description:"所属店铺名称"` SeriesID *uint `json:"series_id,omitempty" description:"套餐系列ID"` SeriesName string `json:"series_name,omitempty" description:"套餐系列名称"` ActivatedAt *time.Time `json:"activated_at,omitempty" description:"激活时间"` CreatedAt time.Time `json:"created_at" description:"创建时间"` UpdatedAt time.Time `json:"updated_at" description:"更新时间"` // 状态聚合字段 RealNameStatus int `json:"real_name_status" description:"实名状态:0未实名 1已实名"` RealNameAt *time.Time `json:"real_name_at" description:"最近一次完成实名的时间,未实名时为 null"` RealnamePolicy string `json:"realname_policy" description:"实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)"` CurrentPackage string `json:"current_package" description:"当前套餐名称(无套餐时为空)"` PackageTotalMB int64 `json:"package_total_mb" description:"当前套餐总虚流量(MB),已按virtual_ratio换算"` PackageUsedMB float64 `json:"package_used_mb" description:"当前已用虚流量(MB),已按virtual_ratio换算"` PackageRemainMB float64 `json:"package_remain_mb" description:"当前套餐剩余虚流量(MB),已按virtual_ratio换算"` DeviceProtectStatus string `json:"device_protect_status,omitempty" description:"设备保护期状态:none/stop/start(仅asset_type=device时有效)"` // 绑定关系字段 ICCID string `json:"iccid,omitempty" description:"卡ICCID(asset_type=card时有效)"` BoundDeviceID *uint `json:"bound_device_id,omitempty" description:"绑定的设备ID(asset_type=card时有效)"` BoundDeviceNo string `json:"bound_device_no,omitempty" description:"绑定的设备虚拟号(asset_type=card时有效)"` BoundDeviceName string `json:"bound_device_name,omitempty" description:"绑定的设备名称(asset_type=card时有效)"` BoundCardCount int `json:"bound_card_count,omitempty" description:"绑定的卡数量(asset_type=device时有效)"` Cards []BoundCardInfo `json:"cards,omitempty" description:"绑定的卡列表(asset_type=device时有效)"` // 设备专属字段(card类型时为零值) 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:"设备类型"` 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:"运营商类型"` CarrierName string `json:"carrier_name,omitempty" description:"运营商名称"` MSISDN string `json:"msisdn,omitempty" description:"手机号"` IMSI string `json:"imsi,omitempty" description:"IMSI"` CardCategory string `json:"card_category,omitempty" description:"卡业务类型"` Supplier string `json:"supplier,omitempty" description:"供应商"` ActivationStatus int `json:"activation_status,omitempty" description:"激活状态"` EnablePolling bool `json:"enable_polling" description:"是否参与轮询"` NetworkStatus int `json:"network_status" description:"网络状态:0停机 1开机(asset_type=card时有效)"` } // BoundCardInfo 设备绑定的卡信息 type BoundCardInfo struct { CardID uint `json:"card_id" description:"卡ID"` 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:"实名状态:0未实名 1已实名"` RealNameAt *time.Time `json:"real_name_at" description:"该卡最近一次完成实名的时间,未实名时为 null"` SlotPosition int `json:"slot_position,omitempty" description:"插槽位置"` IsCurrent bool `json:"is_current" description:"是否为当前使用的卡"` CarrierID uint `json:"carrier_id,omitempty" description:"运营商ID"` CarrierType string `json:"carrier_type,omitempty" description:"运营商类型"` CarrierName string `json:"carrier_name,omitempty" description:"运营商名称"` RealnamePolicy string `json:"realname_policy" description:"实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)"` } // 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已实名"` RealnamePolicy string `json:"realname_policy,omitempty" description:"实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)"` 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" description:"设备实时状态(来自 Gateway sync-info,始终返回,失败时仅含 gateway_msg)"` } // AssetPackageResponse 资产套餐信息 type AssetPackageResponse struct { PackageUsageID uint `json:"package_usage_id" description:"套餐使用记录ID"` PackageID uint `json:"package_id" description:"套餐ID"` PackageName string `json:"package_name" description:"套餐名称"` PackageType string `json:"package_type" description:"套餐类型:formal/addon"` UsageType string `json:"usage_type" description:"使用类型:single_card/device"` Status int `json:"status" description:"状态:0待生效 1生效中 2已用完 3已过期 4已失效"` StatusName string `json:"status_name" description:"状态名称"` DataLimitMB int64 `json:"data_limit_mb" description:"套餐真流量总量(MB)"` VirtualLimitMB int64 `json:"virtual_limit_mb" description:"套餐虚流量总量(MB),按virtual_ratio换算"` DataUsageMB int64 `json:"data_usage_mb" description:"已用真流量(MB)"` VirtualUsedMB float64 `json:"virtual_used_mb" description:"已用虚流量(MB),按virtual_ratio换算"` VirtualRemainMB float64 `json:"virtual_remain_mb" description:"剩余虚流量(MB),按virtual_ratio换算"` VirtualRatio float64 `json:"virtual_ratio" description:"虚流量比例(real/virtual)"` EnableVirtualData bool `json:"enable_virtual_data" description:"是否启用虚流量"` ActivatedAt *time.Time `json:"activated_at,omitempty" description:"激活时间(待生效套餐为空)"` ExpiresAt *time.Time `json:"expires_at,omitempty" description:"到期时间(待生效套餐为空)"` MasterUsageID *uint `json:"master_usage_id,omitempty" description:"主套餐ID(加油包时有值)"` Priority int `json:"priority" description:"优先级"` PaidAmount *int64 `json:"paid_amount,omitempty" description:"购买实付金额(分),线下支付或无订单分配时为空"` CreatedAt time.Time `json:"created_at" description:"创建时间"` } // AssetPackagesResult 套餐列表分页结果 type AssetPackagesResult struct { Total int64 `json:"total" description:"总条数"` Page int `json:"page" description:"当前页码"` PageSize int `json:"page_size" description:"每页条数"` Items []*AssetPackageResponse `json:"items" description:"套餐列表"` } // AssetResolveRequest 资产解析请求(路径参数) type AssetResolveRequest struct { Identifier string `path:"identifier" description:"资产标识符(虚拟号/ICCID/IMEI/SN/MSISDN)" required:"true"` } // AssetIdentifierRequest 资产标识符路径参数请求 type AssetIdentifierRequest struct { Identifier string `path:"identifier" description:"资产标识符(ICCID 或 VirtualNo)" required:"true"` } // AssetTypeIDRequest 资产类型+ID请求(路径参数,保留用于钱包等向后兼容场景) type AssetTypeIDRequest struct { AssetType string `path:"asset_type" description:"资产类型:card 或 device" required:"true"` 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"` } // CardICCIDRequest 卡ICCID请求(路径参数) type CardICCIDRequest struct { ICCID string `path:"iccid" description:"卡ICCID" required:"true"` } // DeviceGatewayInfo B端设备实时状态信息(来自 Gateway sync-info) // 与 C 端 DeviceRealtimeInfo 独立,未来可展示更多技术字段 // 所有字段均为可选;Gateway 调用失败时仅填充 GatewayMsg type DeviceGatewayInfo struct { // Gateway 上游消息(成功时为 null,失败时为错误信息) GatewayMsg *string `json:"gateway_msg" description:"Gateway 上游消息(成功时为 null,失败时为错误信息)"` // 设备状态 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:"最大连接客户端数"` ClientNumber *int `json:"client_number,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用户标识码"` } // AssetOrdersRequest 资产历史订单查询请求 type AssetOrdersRequest struct { Identifier string `path:"identifier" description:"资产标识符(ICCID 或 VirtualNo)" 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:"每页条数(默认20,最大100)"` IncludePrevious bool `query:"include_previous" description:"是否包含前代订单,默认false"` } // AssetOrderItemDetail 订单中的套餐明细 type AssetOrderItemDetail struct { PackageName string `json:"package_name" description:"套餐名称快照"` Quantity int `json:"quantity" description:"数量"` UnitPrice int64 `json:"unit_price" description:"单价(分)"` Amount int64 `json:"amount" description:"小计金额(分)"` } // AssetOrderItem 资产历史订单条目 type AssetOrderItem struct { OrderNo string `json:"order_no" description:"订单号"` OrderType string `json:"order_type" description:"订单类型:single_card/device"` PaymentStatus int `json:"payment_status" description:"支付状态:1待支付 2已支付 3已取消 4已退款"` PaymentStatusText string `json:"payment_status_text" description:"支付状态文本"` TotalAmount int64 `json:"total_amount" description:"订单金额(分)"` PaymentMethod string `json:"payment_method" description:"支付方式:wallet/wechat/alipay/offline"` PaidAt *time.Time `json:"paid_at,omitempty" description:"支付时间"` Generation int `json:"generation" description:"订单所属资产世代编号"` Items []*AssetOrderItemDetail `json:"items" description:"套餐明细列表"` CreatedAt time.Time `json:"created_at" description:"订单创建时间"` } // GenerationOrders 本代订单块(支持分页) type GenerationOrders struct { Generation int `json:"generation" description:"世代编号"` Identifier string `json:"identifier" description:"资产标识符"` AssetType string `json:"asset_type" description:"资产类型:card 或 device"` Total int64 `json:"total" description:"总订单数"` Page int `json:"page" description:"当前页码"` PageSize int `json:"page_size" description:"每页条数"` Items []*AssetOrderItem `json:"items" description:"订单列表"` } // PreviousGenerationOrders 前代订单块(最多20条,不分页) type PreviousGenerationOrders struct { Generation int `json:"generation" description:"前代世代编号"` Identifier string `json:"identifier" description:"前代资产标识符"` AssetType string `json:"asset_type" description:"前代资产类型:card 或 device"` ExchangeNo string `json:"exchange_no" description:"换货单号"` ExchangedAt time.Time `json:"exchanged_at" description:"换货完成时间"` Total int64 `json:"total" description:"前代总订单数"` Items []*AssetOrderItem `json:"items" description:"前代订单列表(最多20条)"` } // AssetOrdersResponse 资产历史订单完整响应 type AssetOrdersResponse struct { CurrentGeneration *GenerationOrders `json:"current_generation" description:"本代订单(含分页)"` PreviousGenerations []*PreviousGenerationOrders `json:"previous_generations,omitempty" description:"前代订单列表(include_previous=true时返回)"` Truncated bool `json:"truncated" description:"是否已截断(换货链超过10代追溯上限时为true)"` } // UpdateAssetPollingStatusRequest 更新资产轮询状态请求 type UpdateAssetPollingStatusRequest struct { Identifier string `path:"identifier" description:"资产标识符(ICCID 或 VirtualNo)" required:"true"` EnablePolling bool `json:"enable_polling" description:"是否启用轮询 (true:启用, false:禁用)"` } // UpdateAssetPollingStatusResponse 更新资产轮询状态响应 type UpdateAssetPollingStatusResponse struct { AssetType string `json:"asset_type" description:"资产类型 (card:IoT卡, device:设备)"` AssetID uint `json:"asset_id" description:"资产ID"` EnablePolling bool `json:"enable_polling" description:"更新后的轮询状态 (true:已启用, false:已禁用)"` } // UpdateAssetRealnamePolicyRequest 更新资产实名认证策略请求 type UpdateAssetRealnamePolicyRequest struct { Identifier string `path:"identifier" description:"资产标识符(ICCID 或 VirtualNo)" required:"true"` RealnamePolicy string `json:"realname_policy" description:"实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)" required:"true" enum:"none,before_order,after_order"` } // UpdateAssetRealnamePolicyResponse 更新资产实名认证策略响应 type UpdateAssetRealnamePolicyResponse struct { AssetType string `json:"asset_type" description:"资产类型 (card:IoT卡, device:设备)"` AssetID uint `json:"asset_id" description:"资产ID"` RealnamePolicy string `json:"realname_policy" description:"更新后的实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名)"` }