From d23e896f97fd2ed475a4eb3a2a68c43c3a51013a Mon Sep 17 00:00:00 2001 From: sexygoat <1538832180@qq.com> Date: Sat, 6 Jun 2026 15:09:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=80=80=E6=AC=BE=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E6=98=AF0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/types/api/refund.ts | 6 +- src/types/components.d.ts | 162 ++++++++++++++++++++++++++++ src/views/finance/refund/detail.vue | 9 +- src/views/finance/refund/index.vue | 13 +-- 4 files changed, 177 insertions(+), 13 deletions(-) diff --git a/src/types/api/refund.ts b/src/types/api/refund.ts index c497027..a91d44a 100644 --- a/src/types/api/refund.ts +++ b/src/types/api/refund.ts @@ -21,9 +21,9 @@ export interface Refund { package_usage_id: number | null asset_identifier: string // 资产标识符 asset_type: string // 资产类型 - requested_refund_amount: number // 申请退款金额(分) - approved_refund_amount: number | null // 实际退款金额(分) - actual_received_amount: number // 实收金额(分) + requested_refund_amount?: number | null // 申请退款金额(分) + approved_refund_amount?: number | null // 实际退款金额(分) + actual_received_amount?: number | null // 实收金额(分) status: RefundStatus refund_reason: string refund_voucher_key?: string // 退款凭证 file_key,多个以英文逗号分隔 diff --git a/src/types/components.d.ts b/src/types/components.d.ts index e69de29..e4f441c 100644 --- a/src/types/components.d.ts +++ b/src/types/components.d.ts @@ -0,0 +1,162 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + AgentSelector: typeof import('./../components/business/AgentSelector.vue')['default'] + ArtBackToTop: typeof import('./../components/core/base/ArtBackToTop.vue')['default'] + ArtBarChart: typeof import('./../components/core/charts/ArtBarChart.vue')['default'] + ArtBarChartCard: typeof import('./../components/core/cards/ArtBarChartCard.vue')['default'] + ArtBasicBanner: typeof import('./../components/core/banners/ArtBasicBanner.vue')['default'] + ArtBreadcrumb: typeof import('./../components/core/layouts/art-breadcrumb/index.vue')['default'] + ArtButtonMore: typeof import('./../components/core/forms/ArtButtonMore.vue')['default'] + ArtButtonTable: typeof import('./../components/core/forms/ArtButtonTable.vue')['default'] + ArtCardBanner: typeof import('./../components/core/banners/ArtCardBanner.vue')['default'] + ArtChatWindow: typeof import('./../components/core/layouts/art-chat-window/index.vue')['default'] + ArtCutterImg: typeof import('./../components/core/media/ArtCutterImg.vue')['default'] + ArtDataListCard: typeof import('./../components/core/cards/ArtDataListCard.vue')['default'] + ArtDataViewer: typeof import('./../components/core/views/ArtDataViewer.vue')['default'] + ArtDonutChartCard: typeof import('./../components/core/cards/ArtDonutChartCard.vue')['default'] + ArtDragVerify: typeof import('./../components/core/forms/ArtDragVerify.vue')['default'] + ArtDualBarCompareChart: typeof import('./../components/core/charts/ArtDualBarCompareChart.vue')['default'] + ArtExcelExport: typeof import('./../components/core/forms/ArtExcelExport.vue')['default'] + ArtExcelImport: typeof import('./../components/core/forms/ArtExcelImport.vue')['default'] + ArtException: typeof import('./../components/core/views/exception/ArtException.vue')['default'] + ArtFastEnter: typeof import('./../components/core/layouts/art-fast-enter/index.vue')['default'] + ArtFestivalTextScroll: typeof import('./../components/core/text-effect/ArtFestivalTextScroll.vue')['default'] + ArtFireworksEffect: typeof import('./../components/core/layouts/art-fireworks-effect/index.vue')['default'] + ArtGlobalSearch: typeof import('./../components/core/layouts/art-global-search/index.vue')['default'] + ArtHBarChart: typeof import('./../components/core/charts/ArtHBarChart.vue')['default'] + ArtHeaderBar: typeof import('./../components/core/layouts/art-header-bar/index.vue')['default'] + ArtHorizontalMenu: typeof import('./../components/core/layouts/art-menus/art-horizontal-menu/index.vue')['default'] + ArtIconSelector: typeof import('./../components/core/base/ArtIconSelector.vue')['default'] + ArtImageCard: typeof import('./../components/core/cards/ArtImageCard.vue')['default'] + ArtKLineChart: typeof import('./../components/core/charts/ArtKLineChart.vue')['default'] + ArtLayouts: typeof import('./../components/core/layouts/art-layouts/index.vue')['default'] + ArtLineChart: typeof import('./../components/core/charts/ArtLineChart.vue')['default'] + ArtLineChartCard: typeof import('./../components/core/cards/ArtLineChartCard.vue')['default'] + ArtLogo: typeof import('./../components/core/base/ArtLogo.vue')['default'] + ArtMapChart: typeof import('./../components/core/charts/ArtMapChart.vue')['default'] + ArtMenuRight: typeof import('./../components/core/others/ArtMenuRight.vue')['default'] + ArtMixedMenu: typeof import('./../components/core/layouts/art-menus/art-mixed-menu/index.vue')['default'] + ArtNotification: typeof import('./../components/core/layouts/art-notification/index.vue')['default'] + ArtPageContent: typeof import('./../components/core/layouts/art-page-content/index.vue')['default'] + ArtProgressCard: typeof import('./../components/core/cards/ArtProgressCard.vue')['default'] + ArtRadarChart: typeof import('./../components/core/charts/ArtRadarChart.vue')['default'] + ArtResultPage: typeof import('./../components/core/views/result/ArtResultPage.vue')['default'] + ArtRingChart: typeof import('./../components/core/charts/ArtRingChart.vue')['default'] + ArtScatterChart: typeof import('./../components/core/charts/ArtScatterChart.vue')['default'] + ArtScreenLock: typeof import('./../components/core/layouts/art-screen-lock/index.vue')['default'] + ArtSearchBar: typeof import('./../components/core/forms/art-search-bar/index.vue')['default'] + ArtSearchDate: typeof import('./../components/core/forms/art-search-bar/widget/art-search-date/index.vue')['default'] + ArtSearchInput: typeof import('./../components/core/forms/art-search-bar/widget/art-search-input/index.vue')['default'] + ArtSearchRadio: typeof import('./../components/core/forms/art-search-bar/widget/art-search-radio/index.vue')['default'] + ArtSearchSelect: typeof import('./../components/core/forms/art-search-bar/widget/art-search-select/index.vue')['default'] + ArtSearchTreeSelect: typeof import('./../components/core/forms/art-search-bar/widget/art-search-tree-select/index.vue')['default'] + ArtSettingsPanel: typeof import('./../components/core/layouts/art-settings-panel/index.vue')['default'] + ArtSidebarMenu: typeof import('./../components/core/layouts/art-menus/art-sidebar-menu/index.vue')['default'] + ArtStatsCard: typeof import('./../components/core/cards/ArtStatsCard.vue')['default'] + ArtTable: typeof import('./../components/core/tables/ArtTable.vue')['default'] + ArtTableFullScreen: typeof import('./../components/core/tables/ArtTableFullScreen.vue')['default'] + ArtTableHeader: typeof import('./../components/core/tables/ArtTableHeader.vue')['default'] + ArtTextScroll: typeof import('./../components/core/text-effect/ArtTextScroll.vue')['default'] + ArtTimelineListCard: typeof import('./../components/core/cards/ArtTimelineListCard.vue')['default'] + ArtVideoPlayer: typeof import('./../components/core/media/ArtVideoPlayer.vue')['default'] + ArtWangEditor: typeof import('./../components/core/forms/ArtWangEditor.vue')['default'] + ArtWatermark: typeof import('./../components/core/others/ArtWatermark.vue')['default'] + ArtWorkTab: typeof import('./../components/core/layouts/art-work-tab/index.vue')['default'] + BasicSettings: typeof import('./../components/core/layouts/art-settings-panel/widget/BasicSettings.vue')['default'] + BatchOperationDialog: typeof import('./../components/business/BatchOperationDialog.vue')['default'] + BoxStyleSettings: typeof import('./../components/core/layouts/art-settings-panel/widget/BoxStyleSettings.vue')['default'] + CardOperationDialog: typeof import('./../components/business/CardOperationDialog.vue')['default'] + CardStatusTag: typeof import('./../components/business/CardStatusTag.vue')['default'] + ChunkErrorBoundary: typeof import('./../components/core/others/ChunkErrorBoundary.vue')['default'] + CodeGeneratorButton: typeof import('./../components/business/CodeGeneratorButton.vue')['default'] + ColorSettings: typeof import('./../components/core/layouts/art-settings-panel/widget/ColorSettings.vue')['default'] + CommentItem: typeof import('./../components/custom/comment-widget/widget/CommentItem.vue')['default'] + 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'] + ElAvatar: typeof import('element-plus/es')['ElAvatar'] + ElButton: typeof import('element-plus/es')['ElButton'] + ElCalendar: typeof import('element-plus/es')['ElCalendar'] + ElCard: typeof import('element-plus/es')['ElCard'] + ElCascader: typeof import('element-plus/es')['ElCascader'] + ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] + ElCol: typeof import('element-plus/es')['ElCol'] + ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] + ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] + ElDescriptions: typeof import('element-plus/es')['ElDescriptions'] + ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem'] + ElDialog: typeof import('element-plus/es')['ElDialog'] + ElDivider: typeof import('element-plus/es')['ElDivider'] + ElDrawer: typeof import('element-plus/es')['ElDrawer'] + ElDropdown: typeof import('element-plus/es')['ElDropdown'] + ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] + ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] + ElEmpty: typeof import('element-plus/es')['ElEmpty'] + ElForm: typeof import('element-plus/es')['ElForm'] + ElFormItem: typeof import('element-plus/es')['ElFormItem'] + ElIcon: typeof import('element-plus/es')['ElIcon'] + ElInput: typeof import('element-plus/es')['ElInput'] + ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] + ElMenu: typeof import('element-plus/es')['ElMenu'] + ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] + ElOption: typeof import('element-plus/es')['ElOption'] + ElPagination: typeof import('element-plus/es')['ElPagination'] + ElPopover: typeof import('element-plus/es')['ElPopover'] + ElProgress: typeof import('element-plus/es')['ElProgress'] + ElRadio: typeof import('element-plus/es')['ElRadio'] + ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] + ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] + ElRow: typeof import('element-plus/es')['ElRow'] + ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] + ElSelect: typeof import('element-plus/es')['ElSelect'] + ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] + ElSwitch: typeof import('element-plus/es')['ElSwitch'] + ElTable: typeof import('element-plus/es')['ElTable'] + ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] + ElTabPane: typeof import('element-plus/es')['ElTabPane'] + ElTabs: typeof import('element-plus/es')['ElTabs'] + ElTag: typeof import('element-plus/es')['ElTag'] + ElTimeline: typeof import('element-plus/es')['ElTimeline'] + ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem'] + ElTooltip: typeof import('element-plus/es')['ElTooltip'] + ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect'] + ElUpload: typeof import('element-plus/es')['ElUpload'] + ElWatermark: typeof import('element-plus/es')['ElWatermark'] + HorizontalSubmenu: typeof import('./../components/core/layouts/art-menus/art-horizontal-menu/widget/HorizontalSubmenu.vue')['default'] + ImportDialog: typeof import('./../components/business/ImportDialog.vue')['default'] + LoginLeftView: typeof import('./../components/core/views/login/LoginLeftView.vue')['default'] + MenuLayoutSettings: typeof import('./../components/core/layouts/art-settings-panel/widget/MenuLayoutSettings.vue')['default'] + MenuStyleSettings: typeof import('./../components/core/layouts/art-settings-panel/widget/MenuStyleSettings.vue')['default'] + OperationLogsDialog: typeof import('./../components/business/OperationLogsDialog.vue')['default'] + OperatorSelect: typeof import('./../components/business/OperatorSelect.vue')['default'] + PackageSelector: typeof import('./../components/business/PackageSelector.vue')['default'] + PaymentVoucherDialog: typeof import('./../components/business/PaymentVoucherDialog.vue')['default'] + RealnamePolicyDialog: typeof import('./../components/device/RealnamePolicyDialog.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + SectionTitle: typeof import('./../components/core/layouts/art-settings-panel/widget/SectionTitle.vue')['default'] + SettingDrawer: typeof import('./../components/core/layouts/art-settings-panel/widget/SettingDrawer.vue')['default'] + SettingHeader: typeof import('./../components/core/layouts/art-settings-panel/widget/SettingHeader.vue')['default'] + SettingItem: typeof import('./../components/core/layouts/art-settings-panel/widget/SettingItem.vue')['default'] + SidebarSubmenu: typeof import('./../components/core/layouts/art-menus/art-sidebar-menu/widget/SidebarSubmenu.vue')['default'] + SpeedLimitDialog: typeof import('./../components/device/SpeedLimitDialog.vue')['default'] + 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/finance/refund/detail.vue b/src/views/finance/refund/detail.vue index d1efd9e..6ce36e1 100644 --- a/src/views/finance/refund/detail.vue +++ b/src/views/finance/refund/detail.vue @@ -42,7 +42,7 @@ {{ refund?.refund_no }} - {{ formatCurrency(refund?.requested_refund_amount || 0) }} + {{ formatCurrency(refund?.requested_refund_amount) }} { + const formatCurrency = (amount: number | null | undefined): string => { + if (amount === undefined || amount === null || Number.isNaN(amount)) return '-' + return `¥${(amount / 100).toFixed(2)}` } @@ -293,8 +295,7 @@ }, { label: '实际退款金额', - formatter: (_, data) => - data.approved_refund_amount ? formatCurrency(data.approved_refund_amount) : '-' + formatter: (_, data) => formatCurrency(data.approved_refund_amount) }, { label: '实收金额', diff --git a/src/views/finance/refund/index.vue b/src/views/finance/refund/index.vue index 657305e..12023b5 100644 --- a/src/views/finance/refund/index.vue +++ b/src/views/finance/refund/index.vue @@ -68,7 +68,7 @@ {{ currentRefund?.refund_no }} - {{ formatCurrency(currentRefund?.requested_refund_amount || 0) }} + {{ formatCurrency(currentRefund?.requested_refund_amount) }} ([]) // 格式化货币 - 将分转换为元 - const formatCurrency = (amount: number): string => { + const formatCurrency = (amount: number | null | undefined): string => { + if (amount === undefined || amount === null || Number.isNaN(amount)) return '-' + return `¥${(amount / 100).toFixed(2)}` } @@ -496,8 +498,7 @@ prop: 'approved_refund_amount', label: '实际退款金额', width: 150, - formatter: (row: Refund) => - row.approved_refund_amount === null ? '-' : formatCurrency(row.approved_refund_amount) + formatter: (row: Refund) => formatCurrency(row.approved_refund_amount) }, { prop: 'actual_received_amount', @@ -797,8 +798,8 @@ const handleShowResubmit = (row: Refund) => { currentRefund.value = row // 预填充原有数据 - resubmitForm.requested_refund_amount = row.requested_refund_amount / 100 - resubmitForm.actual_received_amount = fenToYuan(row.actual_received_amount) + resubmitForm.requested_refund_amount = fenToYuan(row.requested_refund_amount) || undefined + resubmitForm.actual_received_amount = fenToYuan(row.actual_received_amount) || undefined resubmitForm.refund_reason = row.refund_reason resubmitDialogVisible.value = true }