331 lines
9.0 KiB
TypeScript
331 lines
9.0 KiB
TypeScript
import { ref } from 'vue'
|
|
import type { Ref } from 'vue'
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
import { AssetService, DeviceService } from '@/api/modules'
|
|
import { formatRemainingTime, FrontendRateLimitError } from '@/utils/business/apiRateLimit'
|
|
|
|
/**
|
|
* Asset operations composable
|
|
* Manages asset operation methods (enable/disable cards, device operations, etc.)
|
|
*/
|
|
export function useAssetOperations(cardInfo: Ref<any>, refreshAssetFn?: () => Promise<void>) {
|
|
// Loading states
|
|
const enableCardLoading = ref(false)
|
|
const disableCardLoading = ref(false)
|
|
const manualDeactivateCardLoading = ref(false)
|
|
const rebootDeviceLoading = ref(false)
|
|
const resetDeviceLoading = ref(false)
|
|
const speedLimitLoading = ref(false)
|
|
const switchCardLoading = ref(false)
|
|
const setWiFiLoading = ref(false)
|
|
const pollingLoading = ref(false)
|
|
|
|
/**
|
|
* Enable card
|
|
*/
|
|
const enableCard = async () => {
|
|
try {
|
|
await ElMessageBox.confirm('确认要启用此卡吗?', '提示', {
|
|
type: 'warning'
|
|
})
|
|
|
|
enableCardLoading.value = true
|
|
const res = await AssetService.startAsset(cardInfo.value.iccid)
|
|
if (res.code === 0) {
|
|
ElMessage.success('启用成功')
|
|
if (refreshAssetFn) {
|
|
await refreshAssetFn()
|
|
}
|
|
}
|
|
} catch (error: any) {
|
|
if (error !== 'cancel') {
|
|
if (error instanceof FrontendRateLimitError) {
|
|
ElMessage.warning(`操作过于频繁,请${formatRemainingTime(error.remainingMs)}后再试`)
|
|
return
|
|
}
|
|
console.error('启用失败:', error)
|
|
}
|
|
} finally {
|
|
enableCardLoading.value = false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Disable card with confirmation
|
|
*/
|
|
const disableCard = async () => {
|
|
try {
|
|
await ElMessageBox.confirm('确认要停用此卡吗?', '提示', {
|
|
type: 'warning'
|
|
})
|
|
|
|
disableCardLoading.value = true
|
|
const res = await AssetService.stopAsset(cardInfo.value.iccid)
|
|
if (res.code === 0) {
|
|
ElMessage.success('停用成功')
|
|
if (refreshAssetFn) {
|
|
await refreshAssetFn()
|
|
}
|
|
}
|
|
} catch (error: any) {
|
|
if (error !== 'cancel') {
|
|
if (error instanceof FrontendRateLimitError) {
|
|
ElMessage.warning(`操作过于频繁,请${formatRemainingTime(error.remainingMs)}后再试`)
|
|
return
|
|
}
|
|
console.error('停用失败:', error)
|
|
}
|
|
} finally {
|
|
disableCardLoading.value = false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Manually deactivate card with strong warning confirmation
|
|
*/
|
|
const manualDeactivateCard = async () => {
|
|
try {
|
|
await ElMessageBox.confirm(
|
|
'手动停用后卡片将永久停用,无法再次使用。此操作不可逆,请谨慎操作。确认要手动停用吗?',
|
|
'警告',
|
|
{
|
|
type: 'error',
|
|
confirmButtonText: '确认停用',
|
|
cancelButtonText: '取消'
|
|
}
|
|
)
|
|
|
|
manualDeactivateCardLoading.value = true
|
|
const identifier =
|
|
cardInfo.value.asset_type === 'card' ? cardInfo.value.iccid : cardInfo.value.virtual_no
|
|
const res = await AssetService.deactivateAsset(identifier)
|
|
if (res.code === 0) {
|
|
ElMessage.success('手动停用成功')
|
|
if (refreshAssetFn) {
|
|
await refreshAssetFn()
|
|
}
|
|
}
|
|
} catch (error: any) {
|
|
if (error !== 'cancel') {
|
|
console.error('手动停用失败:', error)
|
|
console.log(error?.message || '手动停用失败')
|
|
}
|
|
} finally {
|
|
manualDeactivateCardLoading.value = false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Reboot device with confirmation
|
|
*/
|
|
const rebootDevice = async () => {
|
|
try {
|
|
await ElMessageBox.confirm('确认要重启设备吗?', '提示', {
|
|
type: 'warning'
|
|
})
|
|
|
|
rebootDeviceLoading.value = true
|
|
const res = await DeviceService.rebootDevice(cardInfo.value.imei)
|
|
if (res.code === 0) {
|
|
ElMessage.success(res.data?.message || '重启指令已发送')
|
|
if (refreshAssetFn) {
|
|
await refreshAssetFn()
|
|
}
|
|
}
|
|
} catch (error: any) {
|
|
if (error !== 'cancel') {
|
|
console.error('重启失败:', error)
|
|
}
|
|
} finally {
|
|
rebootDeviceLoading.value = false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Factory reset device with strong warning confirmation
|
|
*/
|
|
const resetDevice = async () => {
|
|
try {
|
|
await ElMessageBox.confirm('恢复出厂设置将清除设备所有数据和配置,确认要继续吗?', '警告', {
|
|
type: 'error',
|
|
confirmButtonText: '确认恢复',
|
|
cancelButtonText: '取消'
|
|
})
|
|
|
|
resetDeviceLoading.value = true
|
|
const res = await DeviceService.resetDevice(cardInfo.value.imei)
|
|
if (res.code === 0) {
|
|
ElMessage.success(res.data?.message || '恢复出厂设置指令已发送')
|
|
if (refreshAssetFn) {
|
|
await refreshAssetFn()
|
|
}
|
|
}
|
|
} catch (error: any) {
|
|
if (error !== 'cancel') {
|
|
console.error('恢复出厂失败:', error)
|
|
}
|
|
} finally {
|
|
resetDeviceLoading.value = false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set device speed limit
|
|
*/
|
|
const setSpeedLimit = async (form: { download_speed: number; upload_speed: number }) => {
|
|
try {
|
|
speedLimitLoading.value = true
|
|
const res = await DeviceService.setSpeedLimit(cardInfo.value.imei, {
|
|
download_speed: form.download_speed,
|
|
upload_speed: form.upload_speed
|
|
})
|
|
if (res.code === 0) {
|
|
ElMessage.success('限速设置成功')
|
|
if (refreshAssetFn) {
|
|
await refreshAssetFn()
|
|
}
|
|
return true
|
|
} else {
|
|
ElMessage.error(res.msg || '设置失败')
|
|
return false
|
|
}
|
|
} catch (error: any) {
|
|
console.error('设置限速失败:', error)
|
|
console.log(error?.message || '设置失败')
|
|
return false
|
|
} finally {
|
|
speedLimitLoading.value = false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Switch to different card
|
|
*/
|
|
const switchCard = async (form: { target_iccid: string }) => {
|
|
try {
|
|
switchCardLoading.value = true
|
|
const res = await DeviceService.switchCard(cardInfo.value.imei, {
|
|
target_iccid: form.target_iccid
|
|
})
|
|
if (res.code === 0) {
|
|
ElMessage.success('切换SIM卡指令已发送')
|
|
if (refreshAssetFn) {
|
|
await refreshAssetFn()
|
|
}
|
|
return true
|
|
} else {
|
|
ElMessage.error(res.msg || '切换失败')
|
|
return false
|
|
}
|
|
} catch (error: any) {
|
|
console.error('切换SIM卡失败:', error)
|
|
console.log(error?.message || '切换失败')
|
|
return false
|
|
} finally {
|
|
switchCardLoading.value = false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Configure WiFi settings
|
|
*/
|
|
const setWiFi = async (form: {
|
|
card_no: string
|
|
enabled: boolean
|
|
ssid: string
|
|
password: string
|
|
}) => {
|
|
try {
|
|
setWiFiLoading.value = true
|
|
const res = await DeviceService.setWiFi(cardInfo.value.imei, {
|
|
card_no: form.card_no,
|
|
enabled: form.enabled,
|
|
ssid: form.ssid,
|
|
password: form.password
|
|
})
|
|
if (res.code === 0) {
|
|
ElMessage.success('WiFi设置成功')
|
|
if (refreshAssetFn) {
|
|
await refreshAssetFn()
|
|
}
|
|
return true
|
|
} else {
|
|
ElMessage.error(res.msg || '设置失败')
|
|
return false
|
|
}
|
|
} catch (error: any) {
|
|
console.error('设置WiFi失败:', error)
|
|
console.log(error?.message || '设置WiFi失败')
|
|
return false
|
|
} finally {
|
|
setWiFiLoading.value = false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update polling status
|
|
*/
|
|
const updatePollingStatus = async (enabled: boolean) => {
|
|
if (!cardInfo.value) {
|
|
ElMessage.warning('无法更新轮询状态:缺少资产信息')
|
|
return false
|
|
}
|
|
|
|
try {
|
|
pollingLoading.value = true
|
|
const identifier =
|
|
cardInfo.value.asset_type === 'card' ? cardInfo.value.iccid : cardInfo.value.virtual_no
|
|
|
|
const response = await AssetService.updatePollingStatus(identifier, {
|
|
enable_polling: enabled
|
|
})
|
|
|
|
if (response.code === 0) {
|
|
ElMessage.success(enabled ? '已开启自动轮询' : '已关闭自动轮询')
|
|
// Update local state
|
|
if (cardInfo.value) {
|
|
cardInfo.value.enable_polling = enabled
|
|
}
|
|
return true
|
|
} else {
|
|
ElMessage.error(response.msg || '更新轮询状态失败')
|
|
return false
|
|
}
|
|
} catch (error: any) {
|
|
console.error('更新轮询状态失败:', error)
|
|
console.log(error?.message || '更新轮询状态失败')
|
|
return false
|
|
} finally {
|
|
pollingLoading.value = false
|
|
}
|
|
}
|
|
|
|
return {
|
|
// Loading states
|
|
enableCardLoading,
|
|
disableCardLoading,
|
|
manualDeactivateCardLoading,
|
|
rebootDeviceLoading,
|
|
resetDeviceLoading,
|
|
speedLimitLoading,
|
|
switchCardLoading,
|
|
setWiFiLoading,
|
|
pollingLoading,
|
|
|
|
// IoT card operations
|
|
enableCard,
|
|
disableCard,
|
|
manualDeactivateCard,
|
|
|
|
// Device operations
|
|
rebootDevice,
|
|
resetDevice,
|
|
setSpeedLimit,
|
|
switchCard,
|
|
setWiFi,
|
|
|
|
// Polling
|
|
updatePollingStatus
|
|
}
|
|
}
|