feat: 财务看板口径重构与半年模拟数据及报销状态注册表

- 重构 finance_dashboard 口径计算,新增模拟公司画像数据生成与筛选
- 引入 expense_claim_status_registry 统一报销状态流转
- 完善报销草稿流程、Item Sync 与本体解析器
- 优化总览页趋势图、分页组件与请求进度步骤
- 增强报销申请快速预览、本体工具与详情展示
- 新增半年报销模拟数据种子脚本与状态审计工具
- 补充财务看板、报销状态注册与模拟数据测试覆盖
This commit is contained in:
caoxiaozhu
2026-06-02 16:22:59 +08:00
parent ca691f3ee0
commit 0c74b4ab4a
54 changed files with 6810 additions and 1238 deletions

View File

@@ -26,7 +26,7 @@
<div class="content-grid top-grid">
<article class="panel dashboard-card trend-panel">
<div class="card-head">
<h3>报销申请与审批趋势 <i class="mdi mdi-information-outline"></i></h3>
<h3>每日报销金额 <i class="mdi mdi-information-outline"></i></h3>
<EnterpriseSelect
v-model="activeTrendRange"
class="card-select"
@@ -37,10 +37,23 @@
</div>
<TrendChart
mode="amount"
:labels="activeTrend.labels"
:applications="activeTrend.applications"
:approved="activeTrend.approved"
:avg-hours="activeTrend.avgHours"
:claim-count="activeTrend.claimCount"
:claim-amount="activeTrend.claimAmount"
/>
</article>
<article class="panel dashboard-card trend-count-panel">
<div class="card-head">
<h3>每日报销数量 <i class="mdi mdi-information-outline"></i></h3>
</div>
<TrendChart
mode="count"
:labels="activeTrend.labels"
:claim-count="activeTrend.claimCount"
:claim-amount="activeTrend.claimAmount"
/>
</article>
@@ -51,20 +64,12 @@
<DonutChart :items="spendLegend" :center-value="spendCenterValue" center-label="费用总额" />
<p class="panel-note">* 百分比按当前时间范围内的费用金额计算</p>
</article>
<article class="panel dashboard-card donut-panel">
<div class="card-head">
<h3>风险异常分布 <i class="mdi mdi-information-outline"></i></h3>
</div>
<DonutChart :items="riskLegend" :center-value="`${riskTotal}`" center-label="异常预警单" />
<p class="panel-note">* 30 天数据</p>
</article>
</div>
<div class="content-grid bottom-grid">
<article class="panel dashboard-card rank-panel">
<div class="card-head">
<h3>部门报销排行待处理金额<i class="mdi mdi-information-outline"></i></h3>
<h3>部门报销排行费用金额<i class="mdi mdi-information-outline"></i></h3>
<EnterpriseSelect
v-model="activeDepartmentRange"
class="card-select"
@@ -77,33 +82,58 @@
<BarChart :items="rankedDepartments" />
</article>
<article class="panel dashboard-card bottleneck-panel">
<article class="panel dashboard-card employee-rank-panel">
<div class="card-head">
<h3>审批瓶颈平均处理时长 <i class="mdi mdi-information-outline"></i></h3>
<h3>个人报销排行本月<i class="mdi mdi-information-outline"></i></h3>
</div>
<div class="bottleneck-list">
<BarChart :items="rankedEmployees" />
</article>
<article class="panel dashboard-card top-claim-panel">
<div class="card-head">
<h3>本月高额单据 <i class="mdi mdi-information-outline"></i></h3>
</div>
<div class="top-claim-list">
<div
v-for="(item, index) in bottlenecks"
:key="item.name"
class="bottleneck-row"
:style="{ '--delay': `${index * 70}ms` }"
v-for="item in topClaims"
:key="item.claimNo"
class="top-claim-row"
>
<div class="reviewer">
<div class="reviewer-avatar">{{ item.avatar }}</div>
<div>
<strong>{{ item.name }}</strong>
<span>{{ item.role }}</span>
</div>
<div>
<strong>{{ item.claimNo }}</strong>
<span>{{ item.employeeName }} · {{ item.departmentName || '未归属部门' }}</span>
</div>
<div class="reviewer-stats">
<strong>{{ item.duration }}</strong>
<span class="status-tag" :class="item.tone">{{ item.status }}</span>
<div>
<strong>{{ item.amountLabel }}</strong>
<span>{{ item.expenseTypeLabel }} · {{ item.statusLabel }}</span>
</div>
</div>
</div>
</article>
<button type="button" class="text-link">查看全部 <i class="mdi mdi-chevron-right"></i></button>
<article class="panel dashboard-card budget-metrics-panel">
<div class="card-head">
<h3>预算指标 <i class="mdi mdi-information-outline"></i></h3>
</div>
<div class="budget-metric-grid">
<div
v-for="(item, index) in budgetMetrics"
:key="item.label"
class="budget-metric-item"
:class="item.tone"
:style="{ '--delay': `${index * 70}ms` }"
>
<span class="budget-metric-icon"><i :class="item.icon"></i></span>
<div>
<span>{{ item.label }}</span>
<strong>{{ item.value }}</strong>
<em>{{ item.detail }}</em>
</div>
</div>
</div>
</article>
<article class="panel dashboard-card budget-panel">
@@ -326,7 +356,7 @@ const {
activeRiskWindowDays,
activeTrend,
activeTrendRange,
bottlenecks,
budgetMetrics,
budgetSummary,
departmentRangeOptions,
digitalEmployeeCategoryRows,
@@ -338,16 +368,15 @@ const {
digitalEmployeeTaskRanking,
kpiMetrics,
rankedDepartments,
rankedEmployees,
riskDashboard,
riskDashboardError,
riskDashboardLoading,
riskDailyTrendRows,
riskLegend,
riskKpiMetrics,
riskLevelLegend,
riskSignalRanking,
riskSourceLegend,
riskTotal,
riskWindowOptions,
setRiskWindowDays,
spendCenterValue,
@@ -362,6 +391,7 @@ const {
systemUsageDurationRows,
systemUsageDurationSummary,
systemUserTokenUsage,
topClaims,
trendRanges
} = useOverviewView(props)