复机实名校验提示适配
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 5m41s

This commit is contained in:
luo
2026-07-21 14:30:30 +08:00
parent 6febc66eca
commit 47a2d88c9d
8 changed files with 172 additions and 6 deletions

View File

@@ -469,6 +469,14 @@
</template>
<!-- IoT卡操作按钮 -->
<ElAlert
v-if="startErrorMessage"
:title="startErrorMessage"
type="error"
:closable="false"
show-icon
style="margin-top: 16px"
/>
<div
v-if="cardInfo?.asset_type === 'card'"
class="card-operations"
@@ -558,6 +566,7 @@
ElTable,
ElTableColumn,
ElButton,
ElAlert,
ElEmpty,
ElMessageBox,
ElMessage
@@ -670,6 +679,7 @@
pollingEnabled: boolean
realtimeLoading?: boolean
startDisabled?: boolean
startErrorMessage?: string
stopDisabled?: boolean
startRemainingText?: string
stopRemainingText?: string
@@ -682,6 +692,7 @@
const props = withDefaults(defineProps<Props>(), {
realtimeLoading: false,
startDisabled: false,
startErrorMessage: '',
stopDisabled: false,
startRemainingText: '',
stopRemainingText: ''

View File

@@ -11,6 +11,7 @@ import { formatRemainingTime, FrontendRateLimitError } from '@/utils/business/ap
export function useAssetOperations(cardInfo: Ref<any>, refreshAssetFn?: () => Promise<void>) {
// Loading states
const enableCardLoading = ref(false)
const startFailureMessage = ref('')
const disableCardLoading = ref(false)
const manualDeactivateCardLoading = ref(false)
const rebootDeviceLoading = ref(false)
@@ -29,22 +30,33 @@ export function useAssetOperations(cardInfo: Ref<any>, refreshAssetFn?: () => Pr
type: 'warning'
})
startFailureMessage.value = ''
enableCardLoading.value = true
const res = await AssetService.startAsset(cardInfo.value.iccid)
const res = await AssetService.startAsset(cardInfo.value.iccid, {
requestOptions: { errorMessageMode: 'none' }
})
if (res.code === 0) {
ElMessage.success('启用成功')
if (refreshAssetFn) {
await refreshAssetFn()
}
return true
}
startFailureMessage.value = res.msg || '复机失败,请稍后重试'
return false
} catch (error: any) {
if (error !== 'cancel') {
if (error instanceof FrontendRateLimitError) {
ElMessage.warning(`操作过于频繁,请${formatRemainingTime(error.remainingMs)}后再试`)
return
return false
}
console.error('启用失败:', error)
const backendMessage = error?.response?.data?.msg
startFailureMessage.value =
typeof backendMessage === 'string' && backendMessage.trim()
? backendMessage
: '复机失败,请稍后重试'
}
return false
} finally {
enableCardLoading.value = false
}
@@ -303,6 +315,7 @@ export function useAssetOperations(cardInfo: Ref<any>, refreshAssetFn?: () => Pr
return {
// Loading states
enableCardLoading,
startFailureMessage,
disableCardLoading,
manualDeactivateCardLoading,
rebootDeviceLoading,

View File

@@ -20,6 +20,7 @@
v-model:polling-enabled="pollingEnabled"
:realtime-loading="realtimeLoading"
:start-disabled="startDisabled"
:start-error-message="startFailureMessage"
:stop-disabled="stopDisabled"
:start-remaining-text="startRemainingText"
:stop-remaining-text="stopRemainingText"
@@ -258,6 +259,7 @@
// ========== 资产操作方法(使用 composable ==========
const {
enableCardLoading,
startFailureMessage,
disableCardLoading,
enableCard: enableCardOp,
disableCard: disableCardOp,
@@ -399,6 +401,7 @@
const handleSearch = async ({ identifier }: { identifier: string }) => {
// 更新搜索框的值
assetSearchCardRef.value?.updateSearchValue(identifier)
startFailureMessage.value = ''
// fetchAssetDetail 内部已经会并行加载所有相关数据,不需要重复调用
await fetchAssetDetail(identifier)
@@ -458,7 +461,10 @@
const handleEnableCard = async () => {
if (startDisabled.value) return
try {
await enableCardOp()
const started = await enableCardOp()
if (started && cardInfo.value) {
await fetchAssetDetail(cardInfo.value.identifier)
}
} finally {
updateRateLimitNow()
}