feat: 资产同步状态与同步轨迹入口
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 4m43s

This commit is contained in:
luo
2026-07-21 09:57:14 +08:00
parent 09225dd8bc
commit eddfd157ad
10 changed files with 208 additions and 44 deletions

View File

@@ -40,7 +40,7 @@
:icon="Refresh"
:disabled="refreshDisabled"
>
{{ refreshButtonText }}
同步
</ElButton>
</div>
</div>
@@ -48,7 +48,7 @@
</template>
<script setup lang="ts">
import { computed, ref } from 'vue'
import { ref } from 'vue'
import { useRoute } from 'vue-router'
import { ElCard, ElInput, ElButton } from 'element-plus'
import { Search, Refresh } from '@element-plus/icons-vue'
@@ -63,19 +63,13 @@
interface Props {
hasCardInfo?: boolean
refreshDisabled?: boolean
refreshRemainingText?: string
}
const props = withDefaults(defineProps<Props>(), {
withDefaults(defineProps<Props>(), {
hasCardInfo: false,
refreshDisabled: false,
refreshRemainingText: ''
refreshDisabled: false
})
const refreshButtonText = computed(() =>
props.refreshRemainingText ? `同步(${props.refreshRemainingText})` : '同步'
)
// Emits
const emit = defineEmits<{
search: [payload: { identifier: string }]

View File

@@ -178,6 +178,42 @@
</template>
</ElDescriptions>
<ElDivider content-position="left">同步状态</ElDivider>
<ElDescriptions :column="descriptionsColumn" border>
<ElDescriptionsItem label="轮询状态">
<ElTag
v-if="cardInfo?.polling"
:type="cardInfo.polling.enabled ? 'success' : 'info'"
size="small"
>
{{ cardInfo.polling.enabled ? '已启用' : '未启用' }}
</ElTag>
<span v-else>-</span>
</ElDescriptionsItem>
<ElDescriptionsItem label="活跃级别">
{{ cardInfo?.polling?.activity_level || '-' }}
</ElDescriptionsItem>
<ElDescriptionsItem label="最后活跃时间">
{{ formatDateTime(cardInfo?.polling?.last_activity_at) || '-' }}
</ElDescriptionsItem>
<ElDescriptionsItem label="最后活跃场景">
{{ cardInfo?.polling?.last_activity_scene || '-' }}
</ElDescriptionsItem>
<ElDescriptionsItem label="下次轮询时间">
{{ formatDateTime(cardInfo?.polling?.next_poll_at) || '-' }}
</ElDescriptionsItem>
<ElDescriptionsItem label="同步轨迹">
<ElButton
v-permission="'asset_info:view_sync_trail'"
type="primary"
link
@click="emit('viewSyncTrail')"
>
查看同步轨迹
</ElButton>
</ElDescriptionsItem>
</ElDescriptions>
<!-- 设备绑定卡列表 -->
<template v-if="cardInfo?.asset_type === 'device'">
<ElDivider content-position="left">绑定卡列表</ElDivider>
@@ -496,6 +532,7 @@
ElMessage
} from 'element-plus'
import { CopyDocument } from '@element-plus/icons-vue'
import type { AssetPollingStatus } from '@/types/api'
import { useAssetFormatters } from '../composables/useAssetFormatters'
import { useAuth } from '@/composables/useAuth'
import { useUserStore } from '@/store/modules/user'
@@ -551,6 +588,7 @@
last_data_check_at?: string | null
last_real_name_check_at?: string | null
last_card_status_check_at?: string | null
polling?: AssetPollingStatus | null
bound_device_id?: number
bound_device_no?: string
bound_device_name?: string
@@ -685,6 +723,7 @@
(e: 'updateBindingCardRealnameStatus', payload: { card: BindingCard }): void
(e: 'navigateToCard', iccid: string): void
(e: 'navigateToDevice', deviceNo: string): void
(e: 'viewSyncTrail'): void
}
const emit = defineEmits<Emits>()