fix: 流量保留两位小数

This commit is contained in:
sexygoat
2026-05-08 14:54:36 +08:00
parent f8bfc3ad69
commit b54d8f5b32
14 changed files with 379 additions and 96 deletions

View File

@@ -70,9 +70,10 @@
},
"vueVersion" : "3",
"h5" : {
"title" : "企业代理H5",
"template" : "index.html",
"router" : {
"mode" : "hash",
"base" : "/h5/"
"mode" : "history"
}
}
}

View File

@@ -2,7 +2,8 @@
import { ref, computed, onMounted } from 'vue'
import { getAssetDetail, getAssetPackages, getCurrentPackage, getAssetHistory, stopAsset, startAsset, getAssetRealtimeStatus } from '@/api/assets'
import type { AssetType, CardInfo, DeviceInfo, AssetPackage, HistoryRecord } from '@/api/assets'
import { formatDataSize, formatTime } from '@/utils/format'
import { formatTime } from '@/utils/format'
import { formatPackageDataSize, formatPackagePrice, getPackageRemainMb, getPackageTotalMb, getPackageUsagePercent, getPackageUsedMb } from '../package-display'
// 资产类型
const assetType = ref<AssetType>('card')
@@ -67,25 +68,6 @@ function getPackageStatusColor(status?: number) {
return status !== undefined ? map[status] || { bg: '#f5f5f5', text: '#999' } : { bg: '#f5f5f5', text: '#999' }
}
function getPackageUsedMb(pkg: AssetPackage) {
return Number(pkg.enable_virtual_data ? pkg.virtual_used_mb : pkg.real_used_mb) || 0
}
function getPackageTotalMb(pkg: AssetPackage) {
return Number(pkg.real_total_mb) || 0
}
function getPackageRemainMb(pkg: AssetPackage) {
return Math.max(0, getPackageTotalMb(pkg) - (Number(pkg.real_used_mb) || 0))
}
function getPackageUsagePercent(pkg: AssetPackage) {
const total = getPackageTotalMb(pkg)
if (total <= 0)
return 0
return Math.min(100, (getPackageUsedMb(pkg) / total) * 100)
}
function getPackageTypeText(type?: AssetPackage['package_type']) {
const map: Record<string, string> = {
formal: '正式套餐',
@@ -94,12 +76,6 @@ function getPackageTypeText(type?: AssetPackage['package_type']) {
return type ? map[type] || type : '-'
}
function formatPackagePrice(amount?: number) {
if (amount === undefined || amount === null)
return '-'
return `¥${(amount / 100).toFixed(2)}`
}
// 页面加载
onMounted(() => {
// 从路由参数获取 assetType 和 assetIdentifier
@@ -548,15 +524,15 @@ function viewWallet() {
<view class="grid grid-cols-3 gap-2 mb-3">
<view class="bg-[#f5f5f5] rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">总量</text>
<text class="text-12px font-600 text-[#212121]">{{ formatDataSize(getPackageTotalMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[#212121]">{{ formatPackageDataSize(getPackageTotalMb(currentPackage)) }}</text>
</view>
<view class="bg-[#f5f5f5] rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">已使用</text>
<text class="text-12px font-600 text-[var(--brand-primary)]">{{ formatDataSize(getPackageUsedMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[var(--brand-primary)]">{{ formatPackageDataSize(getPackageUsedMb(currentPackage)) }}</text>
</view>
<view class="bg-[#f5f5f5] rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">剩余</text>
<text class="text-12px font-600 text-[#2e7d32]">{{ formatDataSize(getPackageRemainMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[#2e7d32]">{{ formatPackageDataSize(getPackageRemainMb(currentPackage)) }}</text>
</view>
</view>
@@ -564,8 +540,8 @@ function viewWallet() {
<view class="flex items-center justify-between mb-1">
<text class="text-11px text-[#666]">已使用</text>
<text class="text-11px font-600 text-[#212121]">
{{ formatDataSize(getPackageUsedMb(currentPackage)) }} /
{{ formatDataSize(getPackageTotalMb(currentPackage)) }}
{{ formatPackageDataSize(getPackageUsedMb(currentPackage)) }} /
{{ formatPackageDataSize(getPackageTotalMb(currentPackage)) }}
</text>
</view>
<view class="h-4px bg-[#e0e0e0] rounded-full overflow-hidden">
@@ -652,12 +628,20 @@ function viewWallet() {
</view>
<view class="flex items-center justify-between mb-1">
<text class="text-12px text-[#666]">
已用: {{ formatDataSize(getPackageUsedMb(pkg)) }} / {{ formatDataSize(getPackageTotalMb(pkg)) }}
已用: {{ formatPackageDataSize(getPackageUsedMb(pkg)) }} / {{ formatPackageDataSize(getPackageTotalMb(pkg)) }}
</text>
<text class="text-11px text-[#999]">
优先级: {{ pkg.priority || '-' }}
</text>
</view>
<view class="flex items-center justify-between mb-1 text-12px">
<text class="text-[#666]">剩余</text>
<text class="text-[#212121]">{{ formatPackageDataSize(getPackageRemainMb(pkg)) }}</text>
</view>
<view class="flex items-center justify-between mb-1 text-12px">
<text class="text-[#666]">金额</text>
<text class="text-[#212121]">{{ formatPackagePrice(pkg.paid_amount) }}</text>
</view>
<text class="text-11px text-[#999]">
{{ pkg.activated_at || '-' }} ~ {{ pkg.expires_at || '-' }}
</text>

View File

@@ -3,6 +3,7 @@
import { resolveAsset, getAssetRealtimeStatus, getCurrentPackage, getAssetPackages } from '@/api/assets'
import type { CardInfo, DeviceInfo, AssetRealtimeStatus, AssetPackage } from '@/api/assets'
import { formatTime, formatDataSize } from '@/utils/format'
import { formatPackageDataSize, formatPackagePrice, getPackageRemainMb, getPackageTotalMb, getPackageUsagePercent, getPackageUsedMb } from '../package-display'
// 搜索关键词
const searchKeyword = ref('')
@@ -200,19 +201,6 @@
return map[status] || { bg: '#f5f5f5', text: '#999' }
}
// 计算套餐使用百分比
function getPackageUsedMb(pkg : AssetPackage) {
return Number(pkg.enable_virtual_data ? pkg.virtual_used_mb : pkg.real_used_mb) || 0
}
function getPackageTotalMb(pkg : AssetPackage) {
return Number(pkg.real_total_mb) || 0
}
function getPackageRemainMb(pkg : AssetPackage) {
return Math.max(0, getPackageTotalMb(pkg) - (Number(pkg.real_used_mb) || 0))
}
function getPackageTypeText(type ?: AssetPackage['package_type']) {
const map : Record<string, string> = {
formal: '正式套餐',
@@ -221,17 +209,6 @@
return type ? map[type] || type : '-'
}
function formatPackagePrice(amount ?: number) {
if (amount === undefined || amount === null) return '-'
return `¥${(amount / 100).toFixed(2)}`
}
function getPackageUsagePercent(pkg : AssetPackage) {
const total = getPackageTotalMb(pkg)
if (total <= 0) return 0
return Math.min(100, (getPackageUsedMb(pkg) / total) * 100)
}
// 获取信号质量等级 (基于 RSRP)
function getSignalQuality(rsrp ?: number) {
if (rsrp === undefined) return { level: '未知', text: '无信号', color: '#999' }
@@ -550,15 +527,15 @@
<view class="grid grid-cols-3 gap-2 mb-3">
<view class="bg-white rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">总量</text>
<text class="text-12px font-600 text-[#212121]">{{ formatDataSize(getPackageTotalMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[#212121]">{{ formatPackageDataSize(getPackageTotalMb(currentPackage)) }}</text>
</view>
<view class="bg-white rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">已使用</text>
<text class="text-12px font-600 text-[var(--brand-primary)]">{{ formatDataSize(getPackageUsedMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[var(--brand-primary)]">{{ formatPackageDataSize(getPackageUsedMb(currentPackage)) }}</text>
</view>
<view class="bg-white rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">剩余</text>
<text class="text-12px font-600 text-[#2e7d32]">{{ formatDataSize(getPackageRemainMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[#2e7d32]">{{ formatPackageDataSize(getPackageRemainMb(currentPackage)) }}</text>
</view>
</view>
@@ -566,8 +543,8 @@
<view class="flex items-center justify-between mb-1">
<text class="text-11px text-[#666]">已使用</text>
<text class="text-11px font-600 text-[#212121]">
{{ formatDataSize(getPackageUsedMb(currentPackage)) }} /
{{ formatDataSize(getPackageTotalMb(currentPackage)) }}
{{ formatPackageDataSize(getPackageUsedMb(currentPackage)) }} /
{{ formatPackageDataSize(getPackageTotalMb(currentPackage)) }}
</text>
</view>
<view class="h-4px bg-[#e0e0e0] rounded-full overflow-hidden">
@@ -620,15 +597,15 @@
<view v-if="false" class="grid grid-cols-3 gap-2 mb-3">
<view class="bg-white rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">总量</text>
<text class="text-12px font-600 text-[#212121]">{{ formatDataSize(getPackageTotalMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[#212121]">{{ formatPackageDataSize(getPackageTotalMb(currentPackage)) }}</text>
</view>
<view class="bg-white rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">已使用</text>
<text class="text-12px font-600 text-[var(--brand-primary)]">{{ formatDataSize(getPackageUsedMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[var(--brand-primary)]">{{ formatPackageDataSize(getPackageUsedMb(currentPackage)) }}</text>
</view>
<view class="bg-white rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">剩余</text>
<text class="text-12px font-600 text-[#2e7d32]">{{ formatDataSize(getPackageRemainMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[#2e7d32]">{{ formatPackageDataSize(getPackageRemainMb(currentPackage)) }}</text>
</view>
</view>
@@ -636,8 +613,8 @@
<view class="flex items-center justify-between mb-1">
<text class="text-11px text-[#666]">已使用</text>
<text class="text-11px font-600 text-[#212121]">
{{ formatDataSize(getPackageUsedMb(currentPackage)) }} /
{{ formatDataSize(getPackageTotalMb(currentPackage)) }}
{{ formatPackageDataSize(getPackageUsedMb(currentPackage)) }} /
{{ formatPackageDataSize(getPackageTotalMb(currentPackage)) }}
</text>
</view>
<view class="h-4px bg-[#e0e0e0] rounded-full overflow-hidden">
@@ -690,15 +667,15 @@
<view v-if="false" class="grid grid-cols-3 gap-2 mb-3">
<view class="bg-white rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">总量</text>
<text class="text-12px font-600 text-[#212121]">{{ formatDataSize(getPackageTotalMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[#212121]">{{ formatPackageDataSize(getPackageTotalMb(currentPackage)) }}</text>
</view>
<view class="bg-white rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">已使用</text>
<text class="text-12px font-600 text-[var(--brand-primary)]">{{ formatDataSize(getPackageUsedMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[var(--brand-primary)]">{{ formatPackageDataSize(getPackageUsedMb(currentPackage)) }}</text>
</view>
<view class="bg-white rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">剩余</text>
<text class="text-12px font-600 text-[#2e7d32]">{{ formatDataSize(getPackageRemainMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[#2e7d32]">{{ formatPackageDataSize(getPackageRemainMb(currentPackage)) }}</text>
</view>
</view>
@@ -706,8 +683,8 @@
<view class="flex items-center justify-between mb-1">
<text class="text-11px text-[#666]">已使用</text>
<text class="text-11px font-600 text-[#212121]">
{{ formatDataSize(getPackageUsedMb(currentPackage)) }} /
{{ formatDataSize(getPackageTotalMb(currentPackage)) }}
{{ formatPackageDataSize(getPackageUsedMb(currentPackage)) }} /
{{ formatPackageDataSize(getPackageTotalMb(currentPackage)) }}
</text>
</view>
<view class="h-4px bg-[#e0e0e0] rounded-full overflow-hidden">
@@ -832,9 +809,17 @@
<view class="flex items-center justify-between text-11px">
<text class="text-[#666]">已使用</text>
<text class="text-[#212121]">
{{ formatDataSize(getPackageUsedMb(pkg)) }} / {{ formatDataSize(getPackageTotalMb(pkg)) }}
{{ formatPackageDataSize(getPackageUsedMb(pkg)) }} / {{ formatPackageDataSize(getPackageTotalMb(pkg)) }}
</text>
</view>
<view class="flex items-center justify-between text-11px">
<text class="text-[#666]">剩余</text>
<text class="text-[#212121]">{{ formatPackageDataSize(getPackageRemainMb(pkg)) }}</text>
</view>
<view class="flex items-center justify-between text-11px">
<text class="text-[#666]">金额</text>
<text class="text-[#212121]">{{ formatPackagePrice(pkg.paid_amount) }}</text>
</view>
<view v-if="pkg.activated_at" class="flex items-center justify-between text-10px">
<text class="text-[#999]">{{ formatTime(pkg.activated_at, 'date') }}</text>
<text v-if="pkg.expires_at" class="text-[#999]"> {{ formatTime(pkg.expires_at, 'date') }}</text>
@@ -1295,15 +1280,15 @@
<view class="grid grid-cols-3 gap-2 mb-3">
<view class="bg-white rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">总量</text>
<text class="text-12px font-600 text-[#212121]">{{ formatDataSize(getPackageTotalMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[#212121]">{{ formatPackageDataSize(getPackageTotalMb(currentPackage)) }}</text>
</view>
<view class="bg-white rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">已使用</text>
<text class="text-12px font-600 text-[var(--brand-primary)]">{{ formatDataSize(getPackageUsedMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[var(--brand-primary)]">{{ formatPackageDataSize(getPackageUsedMb(currentPackage)) }}</text>
</view>
<view class="bg-white rounded-8px p-2 text-center">
<text class="text-10px text-[#999] block mb-1">剩余</text>
<text class="text-12px font-600 text-[#2e7d32]">{{ formatDataSize(getPackageRemainMb(currentPackage)) }}</text>
<text class="text-12px font-600 text-[#2e7d32]">{{ formatPackageDataSize(getPackageRemainMb(currentPackage)) }}</text>
</view>
</view>
@@ -1311,8 +1296,8 @@
<view class="flex items-center justify-between mb-1">
<text class="text-11px text-[#666]">已使用</text>
<text class="text-11px font-600 text-[#212121]">
{{ formatDataSize(getPackageUsedMb(currentPackage)) }} /
{{ formatDataSize(getPackageTotalMb(currentPackage)) }}
{{ formatPackageDataSize(getPackageUsedMb(currentPackage)) }} /
{{ formatPackageDataSize(getPackageTotalMb(currentPackage)) }}
</text>
</view>
<view class="h-4px bg-[#e0e0e0] rounded-full overflow-hidden">
@@ -1438,9 +1423,17 @@
<view class="flex items-center justify-between text-11px">
<text class="text-[#666]">已使用</text>
<text class="text-[#212121]">
{{ formatDataSize(getPackageUsedMb(pkg)) }} / {{ formatDataSize(getPackageTotalMb(pkg)) }}
{{ formatPackageDataSize(getPackageUsedMb(pkg)) }} / {{ formatPackageDataSize(getPackageTotalMb(pkg)) }}
</text>
</view>
<view class="flex items-center justify-between text-11px">
<text class="text-[#666]">剩余</text>
<text class="text-[#212121]">{{ formatPackageDataSize(getPackageRemainMb(pkg)) }}</text>
</view>
<view class="flex items-center justify-between text-11px">
<text class="text-[#666]">金额</text>
<text class="text-[#212121]">{{ formatPackagePrice(pkg.paid_amount) }}</text>
</view>
<view v-if="pkg.activated_at" class="flex items-center justify-between text-10px">
<text class="text-[#999]">{{ formatTime(pkg.activated_at, 'date') }}</text>
<text v-if="pkg.expires_at" class="text-[#999]"> {{ formatTime(pkg.expires_at, 'date') }}</text>

View File

@@ -0,0 +1,44 @@
import type { AssetPackage } from '@/api/assets'
export function getPackageUsedMb(pkg?: AssetPackage | null) {
if (!pkg)
return 0
return Number(pkg.enable_virtual_data ? pkg.virtual_used_mb : pkg.real_used_mb) || 0
}
export function getPackageTotalMb(pkg?: AssetPackage | null) {
if (!pkg)
return 0
return Number(pkg.real_total_mb) || 0
}
export function getPackageRemainMb(pkg?: AssetPackage | null) {
return Math.max(0, getPackageTotalMb(pkg) - getPackageUsedMb(pkg))
}
export function getPackageUsagePercent(pkg?: AssetPackage | null) {
const total = getPackageTotalMb(pkg)
if (total <= 0)
return 0
return Math.min(100, (getPackageUsedMb(pkg) / total) * 100)
}
export function formatPackageDataSize(mb?: number | null) {
const value = Number(mb) || 0
if (value >= 1024)
return `${(value / 1024).toFixed(2)}GB`
return `${value.toFixed(2)}MB`
}
export function formatPackagePrice(amount?: number | null) {
if (amount === undefined || amount === null)
return '-'
const yuan = amount / 100
return Number.isInteger(yuan) ? `¥${yuan}` : `¥${yuan.toFixed(2)}`
}