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

View File

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

View File

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