fix: update some files
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 8m2s

This commit is contained in:
luo
2026-08-19 17:38:09 +08:00
parent 2cb961fd1b
commit fe357f56d9
3 changed files with 178 additions and 82 deletions

View File

@@ -254,8 +254,18 @@
<ElDivider class="info-section-divider" content-position="left">
<span class="section-divider-title">绑定卡列表</span>
</ElDivider>
<div v-if="cardInfo.cards && cardInfo.cards.length > 0" class="binding-card-list">
<ElCard v-for="bindingCard in sortedDeviceCards" :key="bindingCard.iccid" shadow="never">
<div
v-if="cardInfo.cards && cardInfo.cards.length > 0"
class="binding-card-list"
:class="`binding-card-list--${Math.min(sortedDeviceCards.length, 3)}`"
>
<ElCard
v-for="bindingCard in sortedDeviceCards"
:key="bindingCard.iccid"
class="binding-card"
shadow="never"
:class="{ 'binding-card--current': bindingCard.is_current }"
>
<div class="binding-card-header">
<div class="binding-card-identifier">
<ElButton type="primary" link @click="handleNavigateToCardInfo(bindingCard.iccid)">
@@ -265,40 +275,63 @@
<CopyDocument />
</el-icon>
</div>
<ElTag v-if="bindingCard.is_current" type="primary" size="small">当前</ElTag>
<ElTag
v-if="bindingCard.is_current"
class="binding-card-current-tag"
type="primary"
size="default"
>
当前
</ElTag>
</div>
<div class="binding-card-details">
<ElDescriptions :column="bindingCardColumns" direction="vertical">
<ElDescriptionsItem label="MSISDN">
{{ bindingCard.msisdn || '-' }}
</ElDescriptionsItem>
<ElDescriptionsItem label="运营商">
{{ bindingCard.carrier_name || '-' }}
</ElDescriptionsItem>
<ElDescriptionsItem label="卡槽位置">
<div class="binding-card-field">
<span class="binding-card-field-label">MSISDN</span>
<span class="binding-card-field-value">{{ bindingCard.msisdn || '-' }}</span>
</div>
<div class="binding-card-field">
<span class="binding-card-field-label">运营商</span>
<span class="binding-card-field-value">{{ bindingCard.carrier_name || '-' }}</span>
</div>
<div class="binding-card-field">
<span class="binding-card-field-label">卡槽位置</span>
<span class="binding-card-field-value">
SIM-{{ bindingCard.slot_position ?? '-' }}
</ElDescriptionsItem>
<ElDescriptionsItem label="网络状态">
</span>
</div>
<div class="binding-card-field">
<span class="binding-card-field-label">网络状态</span>
<span class="binding-card-field-value">
<ElTag :type="bindingCard.network_status === 1 ? 'success' : 'danger'" size="small">
{{ bindingCard.network_status === 1 ? '正常' : '停机' }}
</ElTag>
</ElDescriptionsItem>
<ElDescriptionsItem label="实名状态">
</span>
</div>
<div class="binding-card-field">
<span class="binding-card-field-label">实名状态</span>
<span class="binding-card-field-value">
<ElTag :type="getRealNameStatusType(bindingCard.real_name_status)" size="small">
{{ getRealNameStatusName(bindingCard.real_name_status) }}
</ElTag>
</ElDescriptionsItem>
<ElDescriptionsItem label="实名认证策略">
</span>
</div>
<div class="binding-card-field">
<span class="binding-card-field-label">实名认证策略</span>
<span class="binding-card-field-value">
{{ getRealnamePolicyName(bindingCard.realname_policy) }}
</ElDescriptionsItem>
<ElDescriptionsItem label="实名时间">
</span>
</div>
<div class="binding-card-field">
<span class="binding-card-field-label">实名时间</span>
<span class="binding-card-field-value">
{{ bindingCard.real_name_at ? formatDateTime(bindingCard.real_name_at) : '-' }}
</ElDescriptionsItem>
<ElDescriptionsItem label="运营商停机原因">
{{ bindingCard.gateway_extend || '-' }}
</ElDescriptionsItem>
</ElDescriptions>
</span>
</div>
<div class="binding-card-field">
<span class="binding-card-field-label">运营商停机原因</span>
<span class="binding-card-field-value">{{ bindingCard.gateway_extend || '-' }}</span>
</div>
</div>
<div class="binding-card-actions">
@@ -306,7 +339,6 @@
v-if="bindingCard.network_status === 0"
type="success"
size="small"
link
:disabled="isBindingStartDisabled(bindingCard)"
@click="handleEnableBindingCard(bindingCard)"
v-permission="'iot_info:start'"
@@ -317,7 +349,6 @@
v-if="bindingCard.network_status === 1"
type="warning"
size="small"
link
:disabled="isBindingStopDisabled(bindingCard)"
@click="handleDisableBindingCard(bindingCard)"
v-permission="'iot_info:stop'"
@@ -327,7 +358,6 @@
<ElButton
type="primary"
size="small"
link
@click="handleUpdateBindingCardRealnameStatus(bindingCard)"
v-permission="'bound_card:update_realname_status'"
>
@@ -337,7 +367,6 @@
v-if="getBindingCardAuditTarget(bindingCard)"
type="primary"
size="small"
link
@click="openBindingCardAudit(bindingCard)"
>
卡审计
@@ -347,6 +376,8 @@
</div>
<ElEmpty v-else description="暂无绑定卡" :image-size="80" style="margin-top: 16px" />
<slot name="current-package" />
<!-- 设备实时信息 -->
<ElDivider class="info-section-divider" content-position="left">
<span class="section-divider-title">设备实时信息</span>
@@ -369,6 +400,8 @@
<ElEmpty v-else description="暂无实时信息" :image-size="80" style="margin-top: 16px" />
</template>
<slot v-if="cardInfo?.asset_type !== 'device'" name="current-package" />
<!-- IoT卡操作按钮 -->
<ElAlert
v-if="startErrorMessage"
@@ -714,8 +747,6 @@
return 5
})
const bindingCardColumns = computed(() => (width.value <= 640 ? 1 : 2))
// Emits
interface Emits {
(e: 'update:pollingEnabled', value: boolean): void
@@ -759,7 +790,15 @@
} = useAssetFormatters()
// 排序后的设备卡列表(按卡槽位置排序,当前卡排在最前面)
const realtimeDescriptionItems = computed(() => {
type RealtimeDescriptionItem = {
key: string
label: string
value: string
tagType?: 'primary' | 'success' | 'warning' | 'info' | 'danger'
span?: number
}
const realtimeDescriptionItems = computed<RealtimeDescriptionItem[]>(() => {
const realtime = props.deviceRealtime
return [
@@ -1132,6 +1171,18 @@
gap: 16px;
}
.binding-card-list--1 {
grid-template-columns: 1fr;
}
.binding-card-list--2 {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.binding-card {
min-width: 0;
}
.binding-card-header,
.binding-card-identifier,
.binding-card-actions {
@@ -1142,11 +1193,52 @@
.binding-card-header {
justify-content: space-between;
padding-bottom: 12px;
border-bottom: 1px solid var(--el-border-color-lighter);
}
.binding-card-details {
padding-top: 12px;
margin-top: 12px;
overflow: hidden;
border: 1px solid var(--el-border-color);
border-radius: 6px;
}
.binding-card-field {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
min-height: 42px;
min-width: 0;
padding: 10px 12px;
border-bottom: 1px solid var(--el-border-color-lighter);
&:last-child {
border-bottom: 0;
}
}
.binding-card-field-label {
flex: 0 0 auto;
font-size: 14px;
color: var(--el-text-color-secondary);
}
.binding-card-field-value {
min-width: 0;
font-size: 15px;
font-weight: 500;
color: var(--el-text-color-primary);
text-align: right;
}
.binding-card--current {
border-color: var(--el-color-primary);
box-shadow: 0 0 0 2px var(--el-color-primary-light-8);
}
.binding-card-current-tag {
font-size: 14px;
font-weight: 600;
}
.binding-card-identifier {
@@ -1168,23 +1260,20 @@
}
.binding-card-actions {
flex-wrap: wrap;
display: flex;
flex-wrap: nowrap;
gap: 8px;
padding-top: 12px;
margin-top: 12px;
border-top: 1px solid var(--el-border-color-lighter);
.el-button {
flex: 1 1 0;
min-width: 0;
width: 100%;
margin-left: 0;
}
}
@media (width <= 1200px) {
.binding-card-list {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
.card-operations,
.device-operations {
display: flex;

View File

@@ -1,13 +1,8 @@
<template>
<ElCard shadow="never" class="info-card current-package-card">
<template #header>
<div class="card-header">
<span class="header-title">当前生效套餐</span>
<div class="header-actions">
<slot name="header-actions" />
</div>
</div>
</template>
<div class="current-package-section">
<ElDivider class="info-section-divider" content-position="left">
<span class="section-divider-title">当前生效套餐</span>
</ElDivider>
<!-- 绑定设备提示优先于一切内容 -->
<template v-if="props.boundDeviceId">
@@ -222,12 +217,12 @@
<!-- 空状态 -->
<ElEmpty v-else-if="!loading" :description="errorMsg || '暂无当前生效套餐'" :image-size="100" />
</ElCard>
</div>
</template>
<script setup lang="ts">
import {
ElCard,
ElDivider,
ElButton,
ElDescriptions,
ElDescriptionsItem,
@@ -322,16 +317,37 @@
</script>
<style scoped lang="scss">
.current-package-card {
.card-header {
.current-package-section {
.info-section-divider {
display: flex;
gap: 12px;
height: 20px;
align-items: center;
justify-content: space-between;
border-top: 0;
.header-title {
font-size: 16px;
font-weight: 500;
:deep(.el-divider__text) {
position: static;
display: inline-flex;
padding: 0;
font-size: 15px;
font-weight: 600;
line-height: 20px;
color: var(--el-text-color-primary);
background-color: transparent;
transform: none;
}
.section-divider-title {
display: inline-flex;
gap: 8px;
align-items: center;
&::before {
width: 3px;
height: 16px;
content: '';
background-color: var(--el-color-primary);
border-radius: 2px;
}
}
}
@@ -460,15 +476,6 @@
}
@media (width <= 768px) {
.card-header {
flex-direction: column;
align-items: flex-start;
.header-actions {
width: 100%;
}
}
.flow-progress-card {
padding: 14px;

View File

@@ -46,20 +46,20 @@
@navigate-to-asset="handleNavigateToAsset"
@navigate-to-card="handleNavigateToCard"
@navigate-to-device="handleNavigateToDevice"
/>
</div>
<div class="row overview-secondary">
<CurrentPackageCard
:current-package="currentPackage"
:loading="currentPackageLoading"
:error-msg="currentPackageErrorMsg"
:bound-device-id="cardInfo.bound_device_id"
:bound-device-no="cardInfo.bound_device_no"
:bound-device-name="cardInfo.bound_device_name"
@show-recharge="showRechargeDialog"
@navigate-to-device="handleNavigateToDevice"
/>
>
<template #current-package>
<CurrentPackageCard
:current-package="currentPackage"
:loading="currentPackageLoading"
:error-msg="currentPackageErrorMsg"
:bound-device-id="cardInfo.bound_device_id"
:bound-device-no="cardInfo.bound_device_no"
:bound-device-name="cardInfo.bound_device_name"
@show-recharge="showRechargeDialog"
@navigate-to-device="handleNavigateToDevice"
/>
</template>
</BasicInfoCard>
</div>
</div>