feat: optimize routing and operations views

This commit is contained in:
hectorzhao
2026-07-29 22:32:28 +08:00
parent 500f43f673
commit c0a4317a7e
21 changed files with 718 additions and 86 deletions
+22 -15
View File
@@ -17,7 +17,7 @@ import {
type TableColumn,
} from '@/components/ui';
import { adminApi, type DashboardResponse, type SendQualityResponse, type SignatureQualityStat } from '@/api/adminApi';
import { createBarOption, createLineOption } from '@/theme/chartOptions';
import { createDualAxisBarLineOption, createLineOption } from '@/theme/chartOptions';
import { formatAmount, moneyUnitsToYuan } from '@/utils/currency';
type EnterpriseSpendRank = {
@@ -92,23 +92,30 @@ export function AdminHome() {
const sendTrendOption = useMemo(
() => createLineOption({
labels: ['今日'],
labels: dashboard?.hourlySendTrend.map((item) => item.label) ?? [],
series: [
{ name: '提交', data: [dashboard?.today.sent ?? 0] },
{ name: '成功', data: [dashboard?.today.delivered ?? 0] },
{ name: '提交总条数', data: dashboard?.hourlySendTrend.map((item) => item.submittedCount) ?? [] },
{ name: '成功条数', data: dashboard?.hourlySendTrend.map((item) => item.successCount) ?? [] },
],
}),
[dashboard],
);
const auditTrendOption = useMemo(
() => createBarOption({
labels: ['企业认证', '短信审核', '模板', '签名', '引流信息'],
series: [
{ name: '待审', data: [pendingAudits.enterpriseCertifications, pendingAudits.smsAudits, pendingAudits.templates, pendingAudits.signatures, pendingAudits.drainageInfos] },
],
const auditSpeedOption = useMemo(
() => createDualAxisBarLineOption({
labels: dashboard?.auditProcessingSpeed.map((item) => item.label) ?? [],
bar: {
name: '审核数量',
data: dashboard?.auditProcessingSpeed.map((item) => item.count) ?? [],
},
line: {
name: '平均处理时长(分钟)',
data: dashboard?.auditProcessingSpeed.map((item) => (
item.averageProcessingMs == null ? null : Number((item.averageProcessingMs / 60_000).toFixed(1))
)) ?? [],
},
}),
[pendingAudits],
[dashboard],
);
const enterpriseColumns: Array<TableColumn<EnterpriseSpendRank>> = [
@@ -212,13 +219,13 @@ export function AdminHome() {
<div className="chart-grid">
<div className="surface chart-card">
<h2></h2>
<p className="muted"></p>
<p className="muted"></p>
<Chart height={300} option={sendTrendOption} />
</div>
<div className="surface chart-card">
<h2></h2>
<p className="muted"></p>
<Chart height={300} option={auditTrendOption} />
<h2></h2>
<p className="muted"></p>
<Chart height={300} option={auditSpeedOption} />
</div>
</div>