feat(adminfinance): 新增预计收入指标并优化明细查询性能

- 财务看板增加预计收入与待结算订单数统计
- 明细列表 COUNT 改为仅扫描 rental_orders 主表,避免 5-JOIN 子查询
- 统一前后端结算差异判定阈值为常量 5 分
- 修复日期选择器使用 UTC 日期导致东八区凌晨偏移前一天的问题
This commit is contained in:
yml2213
2026-07-02 17:33:05 +08:00
parent 1b818b8e4b
commit 512291f089
9 changed files with 147 additions and 45 deletions
@@ -4,11 +4,12 @@ import { computed, onMounted, reactive, ref } from 'vue'
import {
fetchFinanceDashboard,
SETTLEMENT_DIFF_THRESHOLD_CENT,
type FinanceDashboard,
type FinanceDailyItem,
} from '@/features/admin/api/adminFinance'
import { formatCentWithSymbol } from '@/shared/utils/money'
import { formatDateTime } from '@/shared/utils/time'
import { formatDateTime, formatInputDate } from '@/shared/utils/time'
const loading = ref(false)
const dashboard = ref<FinanceDashboard | null>(null)
@@ -44,16 +45,14 @@ function defaultEndDate() {
return formatInputDate(new Date())
}
function formatInputDate(date: Date) {
return date.toISOString().slice(0, 10)
}
function diffType(value: number) {
return Math.abs(Number(value || 0)) >= 5 ? 'danger' : 'success'
return Math.abs(Number(value || 0)) >= SETTLEMENT_DIFF_THRESHOLD_CENT ? 'danger' : 'success'
}
function rowDiffClass(row: FinanceDailyItem) {
return Math.abs(Number(row.settlement_diff_amount_cent || 0)) >= 5 ? 'amount-danger' : ''
return Math.abs(Number(row.settlement_diff_amount_cent || 0)) >= SETTLEMENT_DIFF_THRESHOLD_CENT
? 'amount-danger'
: ''
}
</script>
@@ -130,6 +129,11 @@ function rowDiffClass(row: FinanceDailyItem) {
</strong>
<small>{{ dashboard.summary.financial_exception_count }} 个异常订单</small>
</div>
<div class="metric-card">
<span>预计收入</span>
<strong>{{ moneyCent(dashboard.summary.estimated_income_amount_cent) }}</strong>
<small>{{ dashboard.summary.pending_settle_order_count }} 个待结算订单</small>
</div>
</div>
<el-table v-loading="loading" class="table-panel" :data="dailyItems">
@@ -157,11 +161,17 @@ function rowDiffClass(row: FinanceDailyItem) {
<span :class="rowDiffClass(row)">{{ moneyCent(row.settlement_diff_amount_cent) }}</span>
</template>
</el-table-column>
<el-table-column label="收款/退款/结算" min-width="170">
<template #default="{ row }">
{{ row.successful_pay_count }} / {{ row.successful_refund_count }} /
{{ row.settled_order_count }}
</template>
<el-table-column label="预计收入" width="130">
<template #default="{ row }">{{ moneyCent(row.estimated_income_amount_cent) }}</template>
</el-table-column>
<el-table-column label="销售数量" width="110">
<template #default="{ row }">{{ row.successful_pay_count }}</template>
</el-table-column>
<el-table-column label="退款数量" width="110">
<template #default="{ row }">{{ row.successful_refund_count }}</template>
</el-table-column>
<el-table-column label="结算数量" width="110">
<template #default="{ row }">{{ row.settled_order_count }}</template>
</el-table-column>
</el-table>