From 66e666754a89b896abafce4a53bcd65e396311e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=90=A6?= Date: Tue, 18 Aug 2026 15:43:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8F=90=E7=8E=B0=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=8C=89=E5=8D=95=E7=94=B3=E8=AF=B7=E5=B9=B6=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 账户岛可下钻可提订单,申请支持勾选/时间范围/自定义金额及差额确认;提现详情可打开商品单和挂号单弹窗。 --- .../components/stat-islands/stat-islands.vue | 19 +- .../src/components/stat-islands/typing.ts | 2 + .../finance/charge-cash-pay-record/index.vue | 8 +- .../components/WithdrawalAudit.vue | 52 ++- .../views/finance/withdrawal-audit/index.vue | 9 +- .../src/views/finance/withdrawal/api/index.ts | 5 + .../components/account-info-card.vue | 82 ++++- .../components/apply-orders-modal.vue | 65 ++++ .../components/gap-confirm-modal.vue | 133 +++++++ .../withdrawal/components/statistics.vue | 48 ++- .../components/withdrawable-order-drawer.vue | 103 ++++++ .../components/withdrawal-modal.vue | 340 +++++++++++++++--- .../components/withdrawal-relation-detail.vue | 188 +++++++++- .../views/finance/withdrawal/config/table.ts | 12 +- .../src/views/finance/withdrawal/index.vue | 136 +++++-- .../utils/use-withdraw-order-detail.ts | 89 +++++ .../analysis/analysis-charts-tabs.vue | 11 +- 17 files changed, 1215 insertions(+), 87 deletions(-) create mode 100644 apps/web-antd/src/views/finance/withdrawal/components/apply-orders-modal.vue create mode 100644 apps/web-antd/src/views/finance/withdrawal/components/gap-confirm-modal.vue create mode 100644 apps/web-antd/src/views/finance/withdrawal/components/withdrawable-order-drawer.vue create mode 100644 apps/web-antd/src/views/finance/withdrawal/utils/use-withdraw-order-detail.ts diff --git a/apps/web-antd/src/components/stat-islands/stat-islands.vue b/apps/web-antd/src/components/stat-islands/stat-islands.vue index 6e765707..2792f88b 100644 --- a/apps/web-antd/src/components/stat-islands/stat-islands.vue +++ b/apps/web-antd/src/components/stat-islands/stat-islands.vue @@ -10,15 +10,22 @@ import { IconifyIcon as VbenIcon } from '@vben/icons'; import type { StatIslandItem } from './typing'; -withDefaults( +const props = withDefaults( defineProps<{ items: StatIslandItem[]; /** 每行列数(桌面端),默认 4;窄屏自动降为 2 列 */ columns?: number; + /** 点击统计岛时调用(只处理 clickable 或全部可点项) */ + onItemClick?: (item: StatIslandItem) => void; }>(), { columns: 4 }, ); +function handleItemClick(item: StatIslandItem) { + if (!item.clickable || !props.onItemClick) return; + props.onItemClick(item); +} + /** 金额展示为两位小数;非数字原样透出(如「—」占位) */ function formatValue(val: number | string) { const n = Number(val); @@ -32,8 +39,12 @@ function formatValue(val: number | string) { v-for="item in items" :key="item.key" class="stat-island" - :class="{ 'stat-island--emphasize': item.emphasize }" + :class="{ + 'stat-island--emphasize': item.emphasize, + 'stat-island--clickable': item.clickable, + }" :aria-label="item.label" + @click="handleItemClick(item)" >
@@ -79,6 +90,10 @@ function formatValue(val: number | string) { border-color 0.2s ease; } +.stat-island--clickable { + cursor: pointer; +} + .stat-island:hover { border-color: hsl(var(--primary) / 40%); box-shadow: diff --git a/apps/web-antd/src/components/stat-islands/typing.ts b/apps/web-antd/src/components/stat-islands/typing.ts index f32cc0b7..9c7f718d 100644 --- a/apps/web-antd/src/components/stat-islands/typing.ts +++ b/apps/web-antd/src/components/stat-islands/typing.ts @@ -16,4 +16,6 @@ export interface StatIslandItem { emphasize?: boolean; /** 值前缀,默认 ¥;传空串则不显示前缀 */ prefix?: string; + /** 是否可点击下钻;为 true 时用 pointer 并触发 onItemClick */ + clickable?: boolean; } diff --git a/apps/web-antd/src/views/finance/charge-cash-pay-record/index.vue b/apps/web-antd/src/views/finance/charge-cash-pay-record/index.vue index 7801391b..cbf48d04 100644 --- a/apps/web-antd/src/views/finance/charge-cash-pay-record/index.vue +++ b/apps/web-antd/src/views/finance/charge-cash-pay-record/index.vue @@ -13,6 +13,7 @@ import { TableAction } from '#/components/table-action'; import { getChargeCashPayRecordListApi } from '#/views/finance/charge-cash-pay-record/api'; import StatisticsReconciliation from '#/views/finance/reconciliation/components/statistics.vue'; import WithdrawalRelationDetail from '#/views/finance/withdrawal/components/withdrawal-relation-detail.vue'; +import { useWithdrawOrderDetailModals } from '#/views/finance/withdrawal/utils/use-withdraw-order-detail'; import { formOptions } from './config/search'; import { gridOptions } from './config/table'; @@ -24,6 +25,9 @@ const [Grid, gridApi] = useVbenVxeGrid({ const statistics = ref(); +const { OrderDetailModal, RegisterDetailModal, openOrderDetail } = + useWithdrawOrderDetailModals(); + const [RelationDetailModal, relationDetailApi] = useVbenModal({ connectedComponent: WithdrawalRelationDetail, }); @@ -59,13 +63,15 @@ initTableAjax(); /** 打开提现+代付互通详情 */ const openDetail = (id: number) => { - relationDetailApi.setData({ id, source: 'charge' }); + relationDetailApi.setData({ id, source: 'charge', openOrderDetail }); relationDetailApi.open(); };