This commit is contained in:
@@ -3,7 +3,6 @@
|
||||
v-model="dialogVisible"
|
||||
title="手动更新卡实名状态"
|
||||
width="30%"
|
||||
modal-class="asset-information-dialog"
|
||||
@closed="handleDialogClosed"
|
||||
>
|
||||
<ElForm ref="formRef" :model="formData" :rules="formRules" label-width="80px">
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
v-model="visible"
|
||||
title="设置实名认证策略"
|
||||
width="40%"
|
||||
modal-class="asset-information-dialog"
|
||||
>
|
||||
<ElForm ref="formRef" :model="form" :rules="rules" label-width="80px">
|
||||
<ElFormItem label="资产标识">
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
v-model="visible"
|
||||
title="切换SIM卡"
|
||||
width="40%"
|
||||
modal-class="asset-information-dialog"
|
||||
@close="handleClose"
|
||||
>
|
||||
<div v-if="loading" style="padding: 40px; text-align: center">
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
v-model="visible"
|
||||
title="套餐流量详单"
|
||||
width="900px"
|
||||
modal-class="asset-information-dialog"
|
||||
destroy-on-close
|
||||
>
|
||||
<div v-if="data">
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
v-model="visible"
|
||||
title="往期订单"
|
||||
width="60%"
|
||||
modal-class="asset-information-dialog"
|
||||
destroy-on-close
|
||||
>
|
||||
<div v-if="loading" style="padding: 40px 0; text-align: center">
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
v-model="visible"
|
||||
title="套餐充值"
|
||||
width="40%"
|
||||
modal-class="asset-information-dialog"
|
||||
@closed="handleDialogClosed"
|
||||
>
|
||||
<ElForm ref="formRef" :model="form" :rules="rules" label-width="80px">
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
width="500px"
|
||||
:lock-scroll="true"
|
||||
:z-index="4000"
|
||||
modal-class="asset-information-dialog speed-limit-modal"
|
||||
modal-class="speed-limit-modal"
|
||||
>
|
||||
<ElForm ref="formRef" :model="form" :rules="rules" label-width="120px">
|
||||
<ElFormItem label="固定档位" prop="code">
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
v-model="visible"
|
||||
title="设置切卡模式"
|
||||
width="45%"
|
||||
modal-class="asset-information-dialog"
|
||||
>
|
||||
<ElForm ref="formRef" :model="form" :rules="rules" label-width="80px">
|
||||
<ElFormItem label="设备标识">
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
v-model="visible"
|
||||
title="设置WiFi"
|
||||
width="40%"
|
||||
modal-class="asset-information-dialog"
|
||||
:append-to-body="true"
|
||||
>
|
||||
<ElForm ref="formRef" :model="form" :rules="rules" label-width="80px" autocomplete="off">
|
||||
|
||||
@@ -30,6 +30,9 @@ const NULLABLE_REALTIME_CARD_FIELDS = new Set([
|
||||
'last_card_status_check_at'
|
||||
])
|
||||
|
||||
// 详情接口是绑定卡实名时间的唯一来源;实时状态接口不应覆盖或保留旧值。
|
||||
const DETAIL_ONLY_BOUND_CARD_FIELDS = new Set(['real_name_at'])
|
||||
|
||||
/**
|
||||
* 格式化数据大小(MB -> GB/MB)
|
||||
*/
|
||||
@@ -60,10 +63,13 @@ const mergeAssetBoundCards = (
|
||||
): AssetBoundCard[] =>
|
||||
realtimeCards.map((realtimeCard) => {
|
||||
const existingCard = existingCards.find((card) => card.iccid === realtimeCard.iccid)
|
||||
if (!existingCard) return realtimeCard
|
||||
if (!existingCard) {
|
||||
return { ...realtimeCard, real_name_at: null }
|
||||
}
|
||||
|
||||
const mergedCard = { ...existingCard } as unknown as Record<string, unknown>
|
||||
for (const [key, value] of Object.entries(realtimeCard)) {
|
||||
if (DETAIL_ONLY_BOUND_CARD_FIELDS.has(key)) continue
|
||||
if (value !== undefined && (value !== null || NULLABLE_REALTIME_CARD_FIELDS.has(key))) {
|
||||
mergedCard[key] = value
|
||||
}
|
||||
|
||||
@@ -1653,112 +1653,3 @@
|
||||
background: #ffffff;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="scss">
|
||||
/* Dialogs are teleported to body, so their surface needs a page-level hook. */
|
||||
.asset-information-dialog.el-dialog {
|
||||
max-width: calc(100vw - 32px);
|
||||
overflow: hidden;
|
||||
border: 1px solid #e5eaf1;
|
||||
border-radius: 14px;
|
||||
box-shadow: 0 18px 50px rgb(15 23 42 / 18%);
|
||||
|
||||
.el-dialog__header {
|
||||
padding: 20px 24px 16px;
|
||||
margin: 0;
|
||||
border-bottom: 1px solid #e5eaf1;
|
||||
}
|
||||
|
||||
.el-dialog__title {
|
||||
font-size: 16px;
|
||||
font-weight: 650;
|
||||
color: #172033;
|
||||
letter-spacing: -0.01em;
|
||||
}
|
||||
|
||||
.el-dialog__body {
|
||||
padding: 22px 24px 20px;
|
||||
}
|
||||
|
||||
.el-dialog__footer {
|
||||
padding: 14px 24px 20px;
|
||||
border-top: 1px solid #eef2f7;
|
||||
}
|
||||
|
||||
.el-form-item {
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
|
||||
.el-form-item__label {
|
||||
color: #526078;
|
||||
}
|
||||
|
||||
.el-button {
|
||||
min-height: 34px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.el-table {
|
||||
--el-table-header-bg-color: #f8fafc;
|
||||
--el-table-row-hover-bg-color: #f5f8ff;
|
||||
--el-table-border-color: #e5eaf1;
|
||||
border-radius: 9px;
|
||||
}
|
||||
|
||||
.el-descriptions__label.el-descriptions__cell.is-bordered-label {
|
||||
color: #526078;
|
||||
background: #f8fafc;
|
||||
}
|
||||
|
||||
.dialog-footer {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
}
|
||||
|
||||
@media (width <= 768px) {
|
||||
.asset-information-dialog.el-dialog {
|
||||
width: calc(100vw - 20px) !important;
|
||||
|
||||
.el-dialog__header {
|
||||
padding: 16px 18px 13px;
|
||||
}
|
||||
|
||||
.el-dialog__body {
|
||||
max-height: calc(100vh - 150px);
|
||||
padding: 18px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.el-dialog__footer {
|
||||
padding: 12px 18px 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
html.dark .asset-information-dialog.el-dialog {
|
||||
border-color: #2b3a52;
|
||||
|
||||
.el-dialog__header,
|
||||
.el-dialog__footer {
|
||||
border-color: #2b3a52;
|
||||
}
|
||||
|
||||
.el-dialog__title,
|
||||
.el-form-item__label {
|
||||
color: #e5edf8;
|
||||
}
|
||||
|
||||
.el-table {
|
||||
--el-table-header-bg-color: #202d42;
|
||||
--el-table-row-hover-bg-color: #223451;
|
||||
--el-table-border-color: #2b3a52;
|
||||
}
|
||||
|
||||
.el-descriptions__label.el-descriptions__cell.is-bordered-label {
|
||||
color: #afbdd0;
|
||||
background: #202d42;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -507,12 +507,13 @@
|
||||
const columnOptions = computed(() => {
|
||||
const options = [
|
||||
{ label: '订单编号', prop: 'order_no' },
|
||||
{ label: '资产标识符', prop: 'asset_identifier' },
|
||||
{ label: '购买套餐名称', prop: 'purchased_package_names' },
|
||||
{ label: '买家手机号', prop: 'buyer_phone' },
|
||||
{ label: '买家昵称', prop: 'buyer_nickname' },
|
||||
{ label: '订单类型', prop: 'order_type' },
|
||||
{ label: '资产类型', prop: 'asset_type' },
|
||||
{ label: '买家类型', prop: 'buyer_type' },
|
||||
{ label: '资产标识符', prop: 'asset_identifier' },
|
||||
{ label: '订单渠道', prop: 'purchase_role' },
|
||||
{ label: '购买备注', prop: 'purchase_remark' },
|
||||
{ label: '是否代购', prop: 'is_purchase_on_behalf' },
|
||||
@@ -727,6 +728,14 @@
|
||||
return `¥${(amount / 100).toFixed(2)}`
|
||||
}
|
||||
|
||||
const formatPurchasedPackageNames = (order: Order): string => {
|
||||
const packageNames = (order.items || [])
|
||||
.map((item) => (item.package_name || '').trim())
|
||||
.filter(Boolean)
|
||||
|
||||
return packageNames.join('、') || '-'
|
||||
}
|
||||
|
||||
// 获取支付状态标签类型
|
||||
const getPaymentStatusType = (
|
||||
status: PaymentStatus
|
||||
@@ -847,6 +856,20 @@
|
||||
)
|
||||
}
|
||||
},
|
||||
{
|
||||
prop: 'asset_identifier',
|
||||
label: '资产标识符',
|
||||
width: 180,
|
||||
showOverflowTooltip: true,
|
||||
formatter: (row: Order) => row.asset_identifier || '-'
|
||||
},
|
||||
{
|
||||
prop: 'purchased_package_names',
|
||||
label: '购买套餐名称',
|
||||
minWidth: 180,
|
||||
showOverflowTooltip: true,
|
||||
formatter: (row: Order) => formatPurchasedPackageNames(row)
|
||||
},
|
||||
{
|
||||
prop: 'buyer_phone',
|
||||
label: '买家手机号',
|
||||
@@ -911,13 +934,6 @@
|
||||
width: 180,
|
||||
formatter: (row: Order) => (row.expires_at ? formatDateTime(row.expires_at) : '-')
|
||||
},
|
||||
{
|
||||
prop: 'asset_identifier',
|
||||
label: '资产标识符',
|
||||
width: 180,
|
||||
showOverflowTooltip: true,
|
||||
formatter: (row: Order) => row.asset_identifier || '-'
|
||||
},
|
||||
{
|
||||
prop: 'purchase_role',
|
||||
label: '订单渠道',
|
||||
|
||||
Reference in New Issue
Block a user