diff --git a/src/api/modules/asset.ts b/src/api/modules/asset.ts index 8ffb13f..90a8752 100644 --- a/src/api/modules/asset.ts +++ b/src/api/modules/asset.ts @@ -17,7 +17,9 @@ import type { AssetWalletTransactionParams, AssetWalletResponse, AssetOrdersParams, - AssetOrdersResponse + AssetOrdersResponse, + UpdateAssetRealnameStatusRequest, + DtoUpdateAssetRealnameStatusResponse } from '@/types/api' export class AssetService extends BaseService { @@ -208,12 +210,25 @@ export class AssetService extends BaseService { * @param identifier 资产标识符(ICCID 或 VirtualNo) * @param realname_policy 实名认证策略 (none:无需实名, before_order:先实名后充值/购买, after_order:先充值/购买后实名) */ - static updateRealnamePolicy( - identifier: string, - realname_policy: string - ): Promise { + static updateRealnamePolicy(identifier: string, realname_policy: string): Promise { return this.patch(`/api/admin/assets/${identifier}/realname-mode`, { realname_policy }) } + + /** + * 手动更新资产实名状态 + * PATCH /api/admin/assets/:identifier/realname-status + * @param identifier 资产标识符(ICCID 或 VirtualNo) + * @param data 实名状态数据 + */ + static updateRealnameStatus( + identifier: string, + data: UpdateAssetRealnameStatusRequest + ): Promise> { + return this.patch>( + `/api/admin/assets/${identifier}/realname-status`, + data + ) + } } diff --git a/src/components/business/CreateRefundDialog.vue b/src/components/business/CreateRefundDialog.vue new file mode 100644 index 0000000..5b78342 --- /dev/null +++ b/src/components/business/CreateRefundDialog.vue @@ -0,0 +1,207 @@ + + + diff --git a/src/components/business/UpdateRealnameStatusDialog.vue b/src/components/business/UpdateRealnameStatusDialog.vue new file mode 100644 index 0000000..3dae59e --- /dev/null +++ b/src/components/business/UpdateRealnameStatusDialog.vue @@ -0,0 +1,102 @@ + + + diff --git a/src/types/api/asset.ts b/src/types/api/asset.ts index 42a7ead..3ab471d 100644 --- a/src/types/api/asset.ts +++ b/src/types/api/asset.ts @@ -216,6 +216,7 @@ export interface AssetPackageUsageRecord { master_usage_id?: number | null // 主套餐 ID(加油包时有值) priority?: number // 优先级 created_at?: string // 创建时间 + order_no?: string // 订单号 } /** @@ -412,3 +413,23 @@ export interface AssetOrdersResponse { previous_generations?: GenerationOrders[] // 前代订单(仅 include_previous=true 时有) truncated: boolean // 是否截断(换货链超过 10 代) } + +// ========== 更新实名状态 ========== + +/** + * 更新实名状态请求 + */ +export interface UpdateAssetRealnameStatusRequest { + real_name_status: 0 | 1 // 实名状态 (0:未实名, 1:已实名) +} + +/** + * 更新实名状态响应 + */ +export interface DtoUpdateAssetRealnameStatusResponse { + asset_id: number // 资产ID + asset_type: string // 资产类型 (card:IoT卡) + first_realname_at: string | null // 首次实名时间(仅已实名时可能有值) + real_name_status: number // 更新后的实名状态 (0:未实名, 1:已实名) + real_name_status_name: string // 实名状态名称(中文) +} diff --git a/src/types/components.d.ts b/src/types/components.d.ts index 0ba3055..3c82991 100644 --- a/src/types/components.d.ts +++ b/src/types/components.d.ts @@ -81,6 +81,7 @@ declare module 'vue' { CommentWidget: typeof import('./../components/custom/comment-widget/index.vue')['default'] CommissionDisplay: typeof import('./../components/business/CommissionDisplay.vue')['default'] ContainerSettings: typeof import('./../components/core/layouts/art-settings-panel/widget/ContainerSettings.vue')['default'] + CreateRefundDialog: typeof import('./../components/business/CreateRefundDialog.vue')['default'] CustomerAccountDialog: typeof import('./../components/business/CustomerAccountDialog.vue')['default'] DetailPage: typeof import('./../components/common/DetailPage.vue')['default'] ElAlert: typeof import('element-plus/es')['ElAlert'] @@ -151,6 +152,7 @@ declare module 'vue' { SwitchCardDialog: typeof import('./../components/device/SwitchCardDialog.vue')['default'] TableContextMenuHint: typeof import('./../components/core/others/TableContextMenuHint.vue')['default'] ThemeSettings: typeof import('./../components/core/layouts/art-settings-panel/widget/ThemeSettings.vue')['default'] + UpdateRealnameStatusDialog: typeof import('./../components/business/UpdateRealnameStatusDialog.vue')['default'] } export interface ComponentCustomProperties { vLoading: typeof import('element-plus/es')['ElLoadingDirective'] diff --git a/src/views/asset-management/asset-information/components/BasicInfoCard.vue b/src/views/asset-management/asset-information/components/BasicInfoCard.vue index 92e072c..545956d 100644 --- a/src/views/asset-management/asset-information/components/BasicInfoCard.vue +++ b/src/views/asset-management/asset-information/components/BasicInfoCard.vue @@ -174,7 +174,7 @@ - + @@ -395,6 +404,13 @@ > 实名认证策略 + + 更新实名状态 + @@ -575,8 +591,10 @@ (e: 'showSwitchMode'): void (e: 'show-set-wifi'): void (e: 'showRealnamePolicy'): void + (e: 'showUpdateRealnameStatus'): void (e: 'enableBindingCard', payload: { card: BindingCard }): void (e: 'disableBindingCard', payload: { card: BindingCard }): void + (e: 'updateBindingCardRealnameStatus', payload: { card: BindingCard }): void (e: 'navigateToCard', iccid: string): void (e: 'navigateToDevice', deviceNo: string): void } @@ -680,6 +698,10 @@ emit('showRealnamePolicy') } + const handleShowUpdateRealnameStatus = () => { + emit('showUpdateRealnameStatus') + } + // 绑定卡操作 const handleEnableBindingCard = (card: BindingCard) => { ElMessageBox.confirm(`确定要启用此卡(${card.iccid})吗?`, '启用确认', { @@ -704,6 +726,10 @@ }) .catch(() => {}) } + + const handleUpdateBindingCardRealnameStatus = (card: BindingCard) => { + emit('updateBindingCardRealnameStatus', { card }) + }