fix: update some files
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 8m2s
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 8m2s
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user