|
|
@@ -28,8 +28,7 @@ import ListPage from '@/components/ListPage.vue';
|
|
|
import type { ListColumn } from '@/components/list-column';
|
|
|
import { useListPage } from '@/composables/use-list-page';
|
|
|
import { useScope } from '@/store/scope';
|
|
|
-import { moneyPlain } from '@/utils/format';
|
|
|
-import { formatDateTime } from '@/utils/format';
|
|
|
+import { moneyPlain, formatMoney, formatDateTime } from '@/utils/format';
|
|
|
|
|
|
const scope = useScope();
|
|
|
|
|
|
@@ -97,8 +96,8 @@ const typeText: Record<number, string> = { 100: '充值', 101: '消费', 106: '
|
|
|
const logColumns: ListColumn<ExpenseLogDTO>[] = [
|
|
|
{ prop: 'id', label: '流水号', minWidth: 90 },
|
|
|
{ prop: 'type', label: '类型', minWidth: 90, formatter: (r) => typeText[r.type] ?? String(r.type) },
|
|
|
- { prop: 'money', label: '金额', minWidth: 110, formatter: (r) => `${r.money}` },
|
|
|
- { prop: 'balanceAfter', label: '余额(后)', minWidth: 110 },
|
|
|
+ { prop: 'money', label: '金额', minWidth: 110, formatter: (r) => formatMoney(r.money) },
|
|
|
+ { prop: 'balanceAfter', label: '余额(后)', minWidth: 110, formatter: (r) => formatMoney(r.balanceAfter) },
|
|
|
{ prop: 'remark', label: '备注', minWidth: 140 },
|
|
|
{ prop: 'createTime', label: '时间', minWidth: 150, formatter: (r) => formatDateTime(r.createTime) },
|
|
|
];
|
|
|
@@ -233,7 +232,7 @@ const reqStatusText: Record<number, string> = { 0: '待审', 1: '已通过', '-1
|
|
|
const reqColumns: ListColumn<BalanceRequestDTO>[] = [
|
|
|
{ prop: 'bizNo', label: '单号', minWidth: 140 },
|
|
|
{ prop: 'type', label: '类型', minWidth: 110, formatter: (r) => reqTypeText[r.type] ?? String(r.type) },
|
|
|
- { prop: 'money', label: '金额', minWidth: 100 },
|
|
|
+ { prop: 'money', label: '金额', minWidth: 100, formatter: (r) => formatMoney(r.money) },
|
|
|
{ prop: 'approved', label: '状态', minWidth: 90, formatter: (r) => reqStatusText[r.approved] ?? String(r.approved) },
|
|
|
{ prop: 'remark', label: '备注', minWidth: 120 },
|
|
|
{ prop: 'requestTime', label: '申请时间', minWidth: 140, formatter: (r) => formatDateTime(r.requestTime) },
|
|
|
@@ -301,16 +300,16 @@ const ops: FeeOp[] = [
|
|
|
|
|
|
<!-- ② 仪表盘 -->
|
|
|
<el-row v-if="dash" :gutter="12" class="fee-page__dash">
|
|
|
- <el-col :span="4"><el-card shadow="never"><el-statistic :value="parseFloat(dash.balance)" :precision="2" prefix="¥" title="账户余额" /></el-card></el-col>
|
|
|
- <el-col :span="4"><el-card shadow="never"><el-statistic :value="parseFloat(dash.totalIncome)" :precision="2" prefix="¥" title="累计充值" /></el-card></el-col>
|
|
|
- <el-col :span="4"><el-card shadow="never"><el-statistic :value="parseFloat(dash.totalExpenditure)" :precision="2" prefix="¥" title="累计支出" /></el-card></el-col>
|
|
|
- <el-col :span="4"><el-card shadow="never"><el-statistic :value="parseFloat(dash.specialExpenses)" :precision="2" prefix="¥" title="特殊费用" /></el-card></el-col>
|
|
|
+ <el-col :span="4"><div class="stat-card"><div class="stat-card__label">账户余额</div><div class="stat-card__value">¥ {{ formatMoney(dash.balance) }}</div></div></el-col>
|
|
|
+ <el-col :span="4"><div class="stat-card"><div class="stat-card__label">累计充值</div><div class="stat-card__value">¥ {{ formatMoney(dash.totalIncome) }}</div></div></el-col>
|
|
|
+ <el-col :span="4"><div class="stat-card"><div class="stat-card__label">累计支出</div><div class="stat-card__value">¥ {{ formatMoney(dash.totalExpenditure) }}</div></div></el-col>
|
|
|
+ <el-col :span="4"><div class="stat-card"><div class="stat-card__label">特殊费用</div><div class="stat-card__value">¥ {{ formatMoney(dash.specialExpenses) }}</div></div></el-col>
|
|
|
<el-col :span="8">
|
|
|
<el-card shadow="never">
|
|
|
<template #header>校区余额分布</template>
|
|
|
<div v-for="d in dash.balanceDistribution" :key="d.campusId" class="fee-page__dist">
|
|
|
<span>{{ campusName(d.campusId) }}</span>
|
|
|
- <span>¥ {{ d.balance }}</span>
|
|
|
+ <span class="fee-page__dist-num">¥ {{ formatMoney(d.balance) }}</span>
|
|
|
</div>
|
|
|
</el-card>
|
|
|
</el-col>
|
|
|
@@ -422,6 +421,30 @@ const ops: FeeOp[] = [
|
|
|
padding: 4px 0;
|
|
|
font-size: var(--app-font-md);
|
|
|
}
|
|
|
+.fee-page__dist-num {
|
|
|
+ font-variant-numeric: tabular-nums;
|
|
|
+ color: var(--app-color-text);
|
|
|
+}
|
|
|
+/* 统计卡(标签小字在上、金额左对齐,等宽数字——design-tokens.md §3 对齐口径) */
|
|
|
+.stat-card {
|
|
|
+ background: var(--app-color-card);
|
|
|
+ border: 1px solid var(--app-color-border);
|
|
|
+ border-radius: var(--app-radius-md);
|
|
|
+ padding: 14px 16px;
|
|
|
+ height: 100%;
|
|
|
+ box-sizing: border-box;
|
|
|
+}
|
|
|
+.stat-card__label {
|
|
|
+ font-size: var(--app-font-sm);
|
|
|
+ color: var(--app-color-text-2);
|
|
|
+ margin-bottom: 6px;
|
|
|
+}
|
|
|
+.stat-card__value {
|
|
|
+ font-size: 20px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: var(--app-color-text);
|
|
|
+ font-variant-numeric: tabular-nums;
|
|
|
+}
|
|
|
.fee-page__tabs {
|
|
|
margin-top: 4px;
|
|
|
}
|