This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
import { ref, computed, onMounted } from 'vue'
|
||||
import { getAssetDetail, getAssetPackages, getCurrentPackage, getAssetHistory, stopAsset, startAsset } from '@/api/assets'
|
||||
import type { AssetType, CardInfo, DeviceInfo, AssetPackage, HistoryRecord } from '@/api/assets'
|
||||
import { formatDataSize, formatTime } from '@/utils/format'
|
||||
|
||||
// 资产类型
|
||||
const assetType = ref<AssetType>('card')
|
||||
@@ -55,6 +56,50 @@ const statusColor = computed(() => {
|
||||
: { bg: '#ffebee', text: '#c62828' }
|
||||
})
|
||||
|
||||
function getPackageStatusColor(status?: number) {
|
||||
const map: Record<number, { bg: string, text: string }> = {
|
||||
0: { bg: '#fff3e0', text: '#e65100' },
|
||||
1: { bg: '#e8f5e9', text: '#2e7d32' },
|
||||
2: { bg: '#f5f5f5', text: '#999' },
|
||||
3: { bg: '#ffebee', text: '#c62828' },
|
||||
4: { bg: '#f5f5f5', text: '#999' },
|
||||
}
|
||||
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: '正式套餐',
|
||||
addon: '加油包',
|
||||
}
|
||||
return type ? map[type] || type : '-'
|
||||
}
|
||||
|
||||
function formatPackagePrice(amount?: number) {
|
||||
if (amount === undefined || amount === null)
|
||||
return '-'
|
||||
return `¥${(amount / 100).toFixed(2)}`
|
||||
}
|
||||
|
||||
// 页面加载
|
||||
onMounted(() => {
|
||||
// 从路由参数获取 assetType 和 assetIdentifier
|
||||
@@ -72,7 +117,7 @@ async function loadAssetDetail() {
|
||||
|
||||
try {
|
||||
// 调用资产详情接口
|
||||
const detailData = await getAssetDetail(assetType.value, assetId.value)
|
||||
const detailData = await getAssetDetail(assetType.value, assetIdentifier.value)
|
||||
|
||||
// 根据类型提取详情
|
||||
if (assetType.value === 'card' && detailData.card) {
|
||||
@@ -118,29 +163,16 @@ async function loadAssetDetail() {
|
||||
// 加载套餐列表
|
||||
async function loadPackages() {
|
||||
try {
|
||||
// 1. 调用当前生效套餐接口
|
||||
try {
|
||||
const current = await getCurrentPackage(assetIdentifier.value)
|
||||
currentPackage.value = current
|
||||
} catch (error) {
|
||||
console.warn('获取当前套餐失败:', error)
|
||||
currentPackage.value = null
|
||||
}
|
||||
|
||||
// 2. 调用套餐列表接口
|
||||
currentPackage.value = await getCurrentPackage(assetIdentifier.value)
|
||||
const packagesData = await getAssetPackages(assetIdentifier.value, {
|
||||
page: 1,
|
||||
page_size: 50
|
||||
})
|
||||
packageList.value = packagesData.items || []
|
||||
|
||||
// 如果没有获取到当前套餐,从列表中查找生效中的套餐
|
||||
if (!currentPackage.value && packageList.value.length > 0) {
|
||||
currentPackage.value = packageList.value.find(pkg => pkg.status === 1) || null
|
||||
}
|
||||
}
|
||||
catch (error: any) {
|
||||
console.error('加载套餐列表失败:', error)
|
||||
packageList.value = []
|
||||
}
|
||||
}
|
||||
|
||||
@@ -282,7 +314,7 @@ function viewWallet() {
|
||||
<view class="bg-white rounded-16px shadow-[0_2px_12px_rgba(0,0,0,0.06)] overflow-hidden mb-3">
|
||||
<!-- 顶部信息 -->
|
||||
<view class="px-4 pt-4 pb-3 border-b-1px border-[#f5f5f5]">
|
||||
<view class="flex items-center justify-between mb-3">
|
||||
<view v-if="false" class="flex items-center justify-between mb-3">
|
||||
<view class="flex items-center gap-2">
|
||||
<i
|
||||
:class="[
|
||||
@@ -437,7 +469,83 @@ function viewWallet() {
|
||||
<view v-if="activeTab === 'package'" class="space-y-3">
|
||||
<!-- 当前套餐 -->
|
||||
<view v-if="currentPackage" class="bg-white rounded-16px shadow-[0_2px_12px_rgba(0,0,0,0.06)] p-4">
|
||||
<view class="flex items-center justify-between mb-3">
|
||||
<view class="flex items-start justify-between gap-3 mb-3">
|
||||
<view class="min-w-0 flex-1">
|
||||
<text class="text-14px font-600 text-[#212121] block break-all">
|
||||
{{ currentPackage.package_name || '-' }}
|
||||
</text>
|
||||
<text class="text-11px text-[#999] block mt-1 break-all">
|
||||
订单号:{{ currentPackage.order_no || '-' }}
|
||||
</text>
|
||||
</view>
|
||||
<view
|
||||
:style="{
|
||||
backgroundColor: getPackageStatusColor(currentPackage.status).bg,
|
||||
color: getPackageStatusColor(currentPackage.status).text,
|
||||
}"
|
||||
class="px-2 py-0.5 rounded text-10px font-600"
|
||||
>
|
||||
{{ currentPackage.status_name || '-' }}
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="bg-[#f5f5f5] rounded-8px p-2 mb-3">
|
||||
<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)) }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="h-4px bg-[#e0e0e0] rounded-full overflow-hidden">
|
||||
<view
|
||||
:style="{ width: `${getPackageUsagePercent(currentPackage)}%` }"
|
||||
:class="[
|
||||
'h-full rounded-full transition-all',
|
||||
getPackageUsagePercent(currentPackage) > 90 ? 'bg-[#ff6b6b]' : 'bg-[#3ed268]',
|
||||
]"
|
||||
/>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="space-y-2 mb-1">
|
||||
<view class="flex items-center justify-between text-12px">
|
||||
<text class="text-[#666]">套餐价格</text>
|
||||
<text class="text-[#212121]">{{ formatPackagePrice(currentPackage.paid_amount) }}</text>
|
||||
</view>
|
||||
<view class="flex items-center justify-between text-12px">
|
||||
<text class="text-[#666]">套餐类型</text>
|
||||
<text class="text-[#212121]">{{ getPackageTypeText(currentPackage.package_type) }}</text>
|
||||
</view>
|
||||
<view class="flex items-center justify-between text-12px">
|
||||
<text class="text-[#666]">开始时间</text>
|
||||
<text class="text-[#212121]">{{ formatTime(currentPackage.activated_at) }}</text>
|
||||
</view>
|
||||
<view class="flex items-center justify-between text-12px">
|
||||
<text class="text-[#666]">到期时间</text>
|
||||
<text class="text-[#212121]">{{ formatTime(currentPackage.expires_at) }}</text>
|
||||
</view>
|
||||
<view class="flex items-center justify-between text-12px">
|
||||
<text class="text-[#666]">下单时间</text>
|
||||
<text class="text-[#212121]">{{ formatTime(currentPackage.created_at) }}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="false" class="flex items-center justify-between mb-3">
|
||||
<text class="text-14px font-600 text-[#212121]">
|
||||
当前套餐
|
||||
</text>
|
||||
@@ -446,14 +554,14 @@ function viewWallet() {
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<text class="text-16px font-700 text-[#212121] block mb-2">
|
||||
<text v-if="false" class="text-16px font-700 text-[#212121] block mb-2">
|
||||
{{ currentPackage.package_name || '-' }}
|
||||
</text>
|
||||
<text class="text-14px text-[var(--brand-primary)] font-600 block mb-3">
|
||||
<text v-if="false" class="text-14px text-[var(--brand-primary)] font-600 block mb-3">
|
||||
已用: {{ currentPackage.virtual_used_mb || 0 }}MB / 总量: {{ currentPackage.virtual_limit_mb || 0 }}MB
|
||||
</text>
|
||||
|
||||
<view class="flex items-center justify-between text-12px text-[#999]">
|
||||
<view v-if="false" class="flex items-center justify-between text-12px text-[#999]">
|
||||
<text v-if="currentPackage.activated_at && currentPackage.expires_at">
|
||||
{{ currentPackage.activated_at }} ~ {{ currentPackage.expires_at }}
|
||||
</text>
|
||||
@@ -488,7 +596,7 @@ function viewWallet() {
|
||||
</view>
|
||||
<view class="flex items-center justify-between mb-1">
|
||||
<text class="text-12px text-[#666]">
|
||||
已用: {{ pkg.virtual_used_mb || 0 }}MB / {{ pkg.virtual_limit_mb || 0 }}MB
|
||||
已用: {{ formatDataSize(getPackageUsedMb(pkg)) }} / {{ formatDataSize(getPackageTotalMb(pkg)) }}
|
||||
</text>
|
||||
<text class="text-11px text-[#999]">
|
||||
优先级: {{ pkg.priority || '-' }}
|
||||
@@ -501,10 +609,10 @@ function viewWallet() {
|
||||
</view>
|
||||
|
||||
<!-- 暂无套餐 -->
|
||||
<view v-else class="bg-white rounded-16px shadow-[0_2px_12px_rgba(0,0,0,0.06)] p-4 py-12 center flex-col">
|
||||
<view v-if="!currentPackage" class="bg-white rounded-16px shadow-[0_2px_12px_rgba(0,0,0,0.06)] p-4 py-12 center flex-col">
|
||||
<i class="i-mdi-package-variant-closed text-60px text-[#ddd] mb-2" />
|
||||
<text class="text-13px text-[#999]">
|
||||
暂无套餐数据
|
||||
暂无生效套餐
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
Reference in New Issue
Block a user