fix(operator): fix operator edit issue
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 4m35s
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 4m35s
This commit is contained in:
@@ -0,0 +1,249 @@
|
||||
/**
|
||||
* 资产信息格式化工具函数
|
||||
*/
|
||||
|
||||
import type { Ref } from 'vue'
|
||||
|
||||
export function useAssetFormatters(deviceRealtime?: Ref<any>) {
|
||||
// 格式化数据大小(MB转GB/MB)
|
||||
const formatDataSize = (mb: number) => {
|
||||
if (mb >= 1024) {
|
||||
return `${(mb / 1024).toFixed(2)}GB`
|
||||
}
|
||||
return `${mb.toFixed(2)}MB`
|
||||
}
|
||||
|
||||
// 格式化金额(分转元)
|
||||
const formatAmount = (amount: number | undefined) => {
|
||||
if (amount === undefined || amount === null) return '¥0.00'
|
||||
const yuan = amount / 100
|
||||
return `¥${yuan.toFixed(2)}`
|
||||
}
|
||||
|
||||
// 格式化时长(秒转为时分秒)
|
||||
const formatDuration = (seconds?: string) => {
|
||||
if (!seconds) return '-'
|
||||
const sec = Number(seconds)
|
||||
if (isNaN(sec)) return '-'
|
||||
|
||||
const hours = Math.floor(sec / 3600)
|
||||
const minutes = Math.floor((sec % 3600) / 60)
|
||||
const secs = sec % 60
|
||||
|
||||
if (hours > 0) {
|
||||
return `${hours}小时${minutes}分${secs}秒`
|
||||
} else if (minutes > 0) {
|
||||
return `${minutes}分${secs}秒`
|
||||
} else {
|
||||
return `${secs}秒`
|
||||
}
|
||||
}
|
||||
|
||||
// 格式化ICCID为4位一组,用横杠分隔
|
||||
const formatIccidWithDashes = (iccid: string) => {
|
||||
if (!iccid) return ''
|
||||
return iccid.replace(/(\d{4})(?=\d)/g, '$1-')
|
||||
}
|
||||
|
||||
// 获取实名状态名称
|
||||
const getRealNameStatusName = (status?: number) => {
|
||||
if (status === undefined || status === null) return '未知'
|
||||
const statusMap: Record<number, string> = {
|
||||
0: '未实名',
|
||||
1: '已实名'
|
||||
}
|
||||
return statusMap[status] || '未知'
|
||||
}
|
||||
|
||||
// 获取实名状态标签类型
|
||||
const getRealNameStatusType = (status?: number): 'info' | 'success' | 'warning' | 'danger' => {
|
||||
if (status === undefined || status === null) return 'info'
|
||||
const map: Record<number, 'info' | 'success' | 'warning' | 'danger'> = {
|
||||
0: 'info',
|
||||
1: 'success'
|
||||
}
|
||||
return map[status] || 'info'
|
||||
}
|
||||
|
||||
// 获取资产状态名称
|
||||
const getAssetStatusName = (status?: number) => {
|
||||
if (status === undefined || status === null) return '未知'
|
||||
const map: Record<number, string> = {
|
||||
1: '在库',
|
||||
2: '已分销',
|
||||
3: '已激活',
|
||||
4: '已停用'
|
||||
}
|
||||
return map[status] || '未知'
|
||||
}
|
||||
|
||||
// 获取资产状态标签类型
|
||||
const getAssetStatusType = (
|
||||
status?: number
|
||||
): 'primary' | 'success' | 'warning' | 'info' | 'danger' => {
|
||||
if (status === undefined || status === null) return 'info'
|
||||
const map: Record<number, 'primary' | 'success' | 'warning' | 'info' | 'danger'> = {
|
||||
1: 'info', // 在库
|
||||
2: 'success', // 已分销
|
||||
3: 'success', // 已激活
|
||||
4: 'danger' // 已停用
|
||||
}
|
||||
return map[status] || 'info'
|
||||
}
|
||||
|
||||
// 获取在线状态名称
|
||||
const getOnlineStatusName = (status?: number) => {
|
||||
const map: Record<number, string> = {
|
||||
0: '未知',
|
||||
1: '在线',
|
||||
2: '离线'
|
||||
}
|
||||
return map[status ?? 0] || '未知'
|
||||
}
|
||||
|
||||
// 获取在线状态标签类型
|
||||
const getOnlineStatusType = (
|
||||
status?: number
|
||||
): 'primary' | 'success' | 'warning' | 'info' | 'danger' => {
|
||||
const map: Record<number, 'primary' | 'success' | 'warning' | 'info' | 'danger'> = {
|
||||
0: 'info', // 未知
|
||||
1: 'success', // 在线
|
||||
2: 'danger' // 离线
|
||||
}
|
||||
return map[status ?? 0] || 'info'
|
||||
}
|
||||
|
||||
// 获取钱包状态标签类型
|
||||
const getWalletStatusType = (status?: number) => {
|
||||
const map: Record<number, any> = {
|
||||
1: 'success', // 正常
|
||||
2: 'warning', // 冻结
|
||||
3: 'danger' // 关闭
|
||||
}
|
||||
return map[status || 1] || 'info'
|
||||
}
|
||||
|
||||
// 获取套餐状态标签类型
|
||||
const getPackageStatusTagType = (
|
||||
status?: number
|
||||
): 'primary' | 'success' | 'warning' | 'info' | 'danger' => {
|
||||
if (status === undefined || status === null) return 'info'
|
||||
const map: Record<number, 'primary' | 'success' | 'warning' | 'info' | 'danger'> = {
|
||||
0: 'info', // 待生效
|
||||
1: 'success', // 生效中
|
||||
2: 'warning', // 已用完
|
||||
3: 'danger', // 已过期
|
||||
4: 'info' // 已失效
|
||||
}
|
||||
return map[status] || 'info'
|
||||
}
|
||||
|
||||
// 计算信号强度等级(基于RSSI、RSRP、RSRQ)
|
||||
const calculateSignalStrength = () => {
|
||||
if (!deviceRealtime?.value) return '-'
|
||||
|
||||
const rssi = deviceRealtime.value.rssi ? Number(deviceRealtime.value.rssi) : null
|
||||
const rsrp = deviceRealtime.value.rsrp ? Number(deviceRealtime.value.rsrp) : null
|
||||
|
||||
// 优先使用RSRP判断(更准确)
|
||||
// RSRP范围通常在-140到-44 dBm之间,0或正值表示无效数据
|
||||
if (rsrp !== null && !isNaN(rsrp) && rsrp < 0) {
|
||||
if (rsrp >= -80) return '优秀'
|
||||
if (rsrp >= -90) return '良好'
|
||||
if (rsrp >= -100) return '一般'
|
||||
if (rsrp >= -110) return '较差'
|
||||
return '极差'
|
||||
}
|
||||
|
||||
// 其次使用RSSI
|
||||
// RSSI范围通常在-113到-51 dBm之间,0或正值表示无效数据
|
||||
if (rssi !== null && !isNaN(rssi) && rssi < 0) {
|
||||
if (rssi >= -70) return '优秀'
|
||||
if (rssi >= -85) return '良好'
|
||||
if (rssi >= -100) return '一般'
|
||||
if (rssi >= -110) return '较差'
|
||||
return '极差'
|
||||
}
|
||||
|
||||
return '-'
|
||||
}
|
||||
|
||||
// 获取信号强度标签类型
|
||||
const getSignalStrengthType = (): 'primary' | 'success' | 'warning' | 'info' | 'danger' => {
|
||||
const strength = calculateSignalStrength()
|
||||
const map: Record<string, 'primary' | 'success' | 'warning' | 'info' | 'danger'> = {
|
||||
优秀: 'success',
|
||||
良好: 'success',
|
||||
一般: 'warning',
|
||||
较差: 'danger',
|
||||
极差: 'danger'
|
||||
}
|
||||
return map[strength] || 'info'
|
||||
}
|
||||
|
||||
// 获取切卡模式名称
|
||||
const getSwitchModeName = (mode?: string) => {
|
||||
const map: Record<string, string> = {
|
||||
'0': '自动',
|
||||
'1': '手动'
|
||||
}
|
||||
return map[mode || ''] || '-'
|
||||
}
|
||||
|
||||
// 获取交易类型标签颜色
|
||||
const getTransactionTypeTag = (type: string | undefined) => {
|
||||
const map: Record<string, any> = {
|
||||
recharge: 'success', // 充值
|
||||
deduct: 'danger', // 扣款
|
||||
refund: 'warning' // 退款
|
||||
}
|
||||
return map[type || ''] || 'info'
|
||||
}
|
||||
|
||||
// 获取支付状态标签类型
|
||||
const getPaymentStatusType = (status: number): 'success' | 'warning' | 'danger' | 'info' => {
|
||||
const statusMap: Record<number, 'success' | 'warning' | 'danger' | 'info'> = {
|
||||
1: 'warning', // 待支付
|
||||
2: 'success', // 已支付
|
||||
3: 'danger', // 已取消
|
||||
4: 'info' // 已关闭
|
||||
}
|
||||
return statusMap[status] || 'info'
|
||||
}
|
||||
|
||||
// 计算使用进度百分比
|
||||
const getUsageProgress = (cumulative: number, total: number): number => {
|
||||
if (!total || total <= 0) return 0
|
||||
const percentage = (cumulative / total) * 100
|
||||
return Math.min(Math.round(percentage * 100) / 100, 100)
|
||||
}
|
||||
|
||||
// 根据百分比获取进度条颜色
|
||||
const getProgressColorByPercentage = (percentage: number): string => {
|
||||
if (percentage < 50) return '#67c23a'
|
||||
if (percentage < 80) return '#e6a23c'
|
||||
return '#f56c6c'
|
||||
}
|
||||
|
||||
return {
|
||||
formatDataSize,
|
||||
formatAmount,
|
||||
formatDuration,
|
||||
formatIccidWithDashes,
|
||||
getRealNameStatusName,
|
||||
getRealNameStatusType,
|
||||
getAssetStatusName,
|
||||
getAssetStatusType,
|
||||
getOnlineStatusName,
|
||||
getOnlineStatusType,
|
||||
getWalletStatusType,
|
||||
getPackageStatusTagType,
|
||||
calculateSignalStrength,
|
||||
getSignalStrengthType,
|
||||
getSwitchModeName,
|
||||
getTransactionTypeTag,
|
||||
getPaymentStatusType,
|
||||
getUsageProgress,
|
||||
getProgressColorByPercentage
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user