fix: 流量保留两位小数
This commit is contained in:
@@ -70,9 +70,10 @@
|
||||
},
|
||||
"vueVersion" : "3",
|
||||
"h5" : {
|
||||
"title" : "企业代理H5",
|
||||
"template" : "index.html",
|
||||
"router" : {
|
||||
"mode" : "hash",
|
||||
"base" : "/h5/"
|
||||
"mode" : "history"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
44
src/pages/agent-system/package-display.ts
Normal file
44
src/pages/agent-system/package-display.ts
Normal 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)}`
|
||||
}
|
||||
Reference in New Issue
Block a user