fix: 退款审批可以是0
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 4m43s

This commit is contained in:
sexygoat
2026-06-06 15:09:31 +08:00
parent c5e4082c26
commit d23e896f97
4 changed files with 177 additions and 13 deletions

View File

@@ -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多个以英文逗号分隔

View File

@@ -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']
}
}

View File

@@ -42,7 +42,7 @@
<span>{{ refund?.refund_no }}</span>
</ElFormItem>
<ElFormItem label="申请退款金额">
<span>{{ formatCurrency(refund?.requested_refund_amount || 0) }}</span>
<span>{{ formatCurrency(refund?.requested_refund_amount) }}</span>
</ElFormItem>
<ElFormItem label="实际退款金额" prop="approved_refund_amount">
<ElInputNumber
@@ -236,7 +236,9 @@
refund_reason: ''
})
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)}`
}
@@ -293,8 +295,7 @@
},
{
label: '实际退款金额',
formatter: (_, data) =>
data.approved_refund_amount ? formatCurrency(data.approved_refund_amount) : '-'
formatter: (_, data) => formatCurrency(data.approved_refund_amount)
},
{
label: '实收金额',

View File

@@ -68,7 +68,7 @@
<span>{{ currentRefund?.refund_no }}</span>
</ElFormItem>
<ElFormItem label="申请退款金额">
<span>{{ formatCurrency(currentRefund?.requested_refund_amount || 0) }}</span>
<span>{{ formatCurrency(currentRefund?.requested_refund_amount) }}</span>
</ElFormItem>
<ElFormItem label="实际退款金额" prop="approved_refund_amount">
<ElInputNumber
@@ -410,7 +410,9 @@
const refundList = ref<Refund[]>([])
// 格式化货币 - 将分转换为元
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
}