# 资产详情流量展示 Spec ## 1. 背景 原始说明见 `docs/资产详情流量.md`。 本次需要统一资产详情中套餐流量的展示口径,避免“当前生效套餐”和“套餐列表”出现字段选择不一致、剩余流量计算不一致的问题。 本 Spec 仅定义前端展示和计算规则,不涉及后端接口改造。 --- ## 2. 适用范围 ### 页面范围 - 资产详情页:`src/pages/agent-system/asset-detail/index.vue` ### 联动范围 - 资产搜索页中的同类套餐展示:`src/pages/agent-system/asset-search/index.vue` ### 本次覆盖的 UI 区块 - 当前生效套餐卡片 - 套餐列表中的流量摘要 - 套餐进度条文案与进度百分比 ### 不在本次范围内 - 后端接口字段定义 - 其他页面中与套餐无关的流量汇总展示 --- ## 3. 数据来源 ### 当前生效套餐 - 接口:`GET /api/admin/assets/:identifier/current-package` ### 套餐列表 - 接口:`GET /api/admin/assets/:identifier/packages` ### 本次展示使用的关键字段 | 字段 | 类型 | 说明 | |------|------|------| | `real_total_mb` | number | 真流量总量 | | `real_used_mb` | number | 真流量已使用 | | `virtual_used_mb` | number | 虚流量已使用 | | `enable_virtual_data` | boolean | 是否按虚流量口径展示已使用 | | `paid_amount` | number | 套餐金额,单位分 | 说明: - 本次总流量固定使用 `real_total_mb` - 本次已使用根据 `enable_virtual_data` 在 `virtual_used_mb` 和 `real_used_mb` 间切换 - 本次剩余流量以前端计算结果为准,不直接取其他剩余字段 --- ## 4. 统一展示口径 | 展示项 | 计算规则 | 备注 | |------|------|------| | 总流量 | `real_total_mb` | 固定使用该字段 | | 已使用 | `enable_virtual_data === true ? virtual_used_mb : real_used_mb` | 仅做字段切换,不做额外换算 | | 剩余 | `max(总流量 - 已使用, 0)` | 与页面展示的“已使用”保持同口径 | | 进度百分比 | `total <= 0 ? 0 : min(已使用 / 总流量 * 100, 100)` | 进度条与文案必须一致 | ### 明确约束 1. 不使用 `virtual_total_mb` 作为“总流量”展示值。 2. 不使用 `real_used_mb` 单独计算“剩余”,必须使用页面实际展示的“已使用”值参与计算。 3. 不因为字段名差异而在前端自行做虚实流量换算。 --- ## 5. 页面展示要求 ### 5.1 当前生效套餐 当前卡片中的以下区域必须使用统一口径: - `总量`:显示 `real_total_mb` - `已使用`:根据 `enable_virtual_data` 切换展示 - `剩余`:使用 `总量 - 已使用` - 进度条文案:`已使用 / 总量` - 进度条宽度:使用同一组 `已使用`、`总量` 计算 - `总量`、`已使用`、`剩余` 的展示值统一保留两位小数 ### 5.2 套餐列表 套餐列表每一项中当前展示的 `已用 / 总量` 必须使用相同口径: - `已用`:根据 `enable_virtual_data` 切换 - `总量`:固定使用 `real_total_mb` - `剩余`:显示 `总量 - 已使用` - `金额`:显示 `paid_amount / 100` 后的元金额 - `总量`、`已用`、`剩余` 的展示值统一保留两位小数 如果后续套餐列表新增“剩余”字段,必须沿用本 Spec 中的剩余计算规则,不得单独定义。 --- ## 6. 边界处理 ### 空值处理 - `null`、`undefined`、`NaN` 按 `0` 处理 ### 超限处理 - 当 `已使用 > 总流量` 时: - `剩余` 显示 `0` - 进度条按 `100%` 展示 ### 总量为 0 - `总量 = 0` 时: - `已使用` 按规则正常显示 - `剩余` 显示 `0` - 进度条显示 `0%` --- ## 7. 实现要求 ### 统一计算入口 建议统一封装以下计算函数,并在相关页面复用: - `getPackageTotalMb` - `getPackageUsedMb` - `getPackageRemainMb` - `getPackageUsagePercent` ### 关键实现要求 - `getPackageRemainMb` 必须改为基于“当前展示的已使用值”计算 - `asset-detail` 与 `asset-search` 不允许维护不同口径的同名逻辑 - 格式化继续沿用现有 `formatDataSize`,本次不单独引入新的单位换算规则 --- ## 8. 验收标准 ### 验收用例 1:`enable_virtual_data = true` 输入: ```json { "real_total_mb": 1024000, "real_used_mb": 7848, "virtual_used_mb": 11211.425208, "enable_virtual_data": true } ``` 期望: - 总流量 = `1024000` - 已使用 = `11211.425208` - 剩余 = `1012788.574792` - 进度百分比约 = `1.09%` 格式化后参考展示: - 总量:`1000.00GB` - 已使用:`10.95GB` - 剩余:`989.05GB` ### 验收用例 2:`enable_virtual_data = false` 输入: ```json { "real_total_mb": 1024000, "real_used_mb": 7848, "virtual_used_mb": 11211.425208, "enable_virtual_data": false } ``` 期望: - 总流量 = `1024000` - 已使用 = `7848` - 剩余 = `1016152` ### 验收用例 3:超限 输入: ```json { "real_total_mb": 100, "real_used_mb": 120, "virtual_used_mb": 120, "enable_virtual_data": false } ``` 期望: - 已使用 = `120` - 剩余 = `0` - 进度条 = `100%` ### 验收用例 4:跨页面一致性 - 同一套餐数据在 `asset-detail` 与 `asset-search` 中展示结果一致 - 当前生效套餐卡片与套餐列表摘要使用同一套字段口径 --- ## 9. 结论 本次变更的核心是统一三件事: 1. 总流量固定取 `real_total_mb` 2. 已使用根据 `enable_virtual_data` 选择 `virtual_used_mb` 或 `real_used_mb` 3. 剩余必须使用 `总流量 - 已使用` 计算,不能再固定减 `real_used_mb`