fix(web): 运营仪表盘数据映射错误和浮点精度修复
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled

- OperatorWorkbench: "今日活跃用户" 错误使用体征上报率数据源,改为 pointsStats.active_accounts
- OperatorWorkbench: AI 摘要体征上报率显示原始浮点数(22.413793...),改为保留两位小数
- OperatorWorkbench: "科普阅读量" fallback 错误回退到积分发放数据,移除错误 fallback
- Home.tsx: 运营角色 ROLE_STATS "内容发布" 数据源错误,修正为 patientStats
- Home.tsx: 移除未使用的 TodoList/AiInsightPanel import
- .lintstagedrc.js: 修复 Windows 平台 eslint 命令,使用函数式获取文件名列表
This commit is contained in:
iven
2026-05-09 02:27:38 +08:00
parent 19705e31bd
commit 07217336e7
3 changed files with 9 additions and 10 deletions

View File

@@ -3,10 +3,8 @@ module.exports = {
'cargo fmt --check --',
() => 'cargo clippy -p erp-health -p erp-server -- -D warnings',
],
'apps/web/src/**/*.{ts,tsx}': () =>
process.platform === 'win32'
? 'pushd apps/web && npx eslint --fix src/ & popd'
: 'cd apps/web && npx eslint --fix src/',
'apps/web/src/**/*.{ts,tsx}': (filenames) =>
`npx eslint --fix ${filenames.join(' ')}`,
'apps/web/src/**/*.test.{ts,tsx}': [
'cd apps/web && npx vitest run --reporter=verbose',
],

View File

@@ -30,8 +30,6 @@ import { listPendingTasks, type TaskInfo } from '../api/workflowTasks';
import { pointsApi, type PersonalStats } from '../api/health/points';
import { useStatsData } from './health/StatisticsDashboard/useStatsData';
import { useCountUp } from '../hooks/useCountUp';
import TodoList from './health/components/workbench/TodoList';
import AiInsightPanel from './health/components/workbench/AiInsightPanel';
import ActionDetailDrawer from './health/components/workbench/ActionDetailDrawer';
import TaskQueue from './health/components/workbench/TaskQueue';
import TaskDetail from './health/components/workbench/TaskDetail';
@@ -140,7 +138,7 @@ const ROLE_STATS: Record<DashboardRole, StatCardDef[]> = {
{ key: 'issued', title: '积分发放', getValue: (_p, s) => s.pointsStats?.total_issued ?? 0, icon: <TrophyOutlined />, path: '/health/points' },
{ key: 'spent', title: '积分消费', getValue: (_p, s) => s.pointsStats?.total_spent ?? 0, icon: <ShoppingOutlined />, path: '/health/mall' },
{ key: 'active', title: '活跃账户', getValue: (_p, s) => s.pointsStats?.active_accounts ?? 0, icon: <TeamOutlined />, path: '/health/points' },
{ key: 'articles', title: '内容发布', getValue: (_p, s) => s.pointsStats?.total_issued ?? 0, icon: <FileTextOutlined />, path: '/health/content' },
{ key: 'articles', title: '内容发布', getValue: (_p, s) => s.patientStats?.total_patients ?? 0, icon: <FileTextOutlined />, path: '/health/content' },
],
};

View File

@@ -51,9 +51,12 @@ export default function OperatorWorkbench() {
const now = new Date();
const greeting = now.getHours() < 12 ? '早上好' : now.getHours() < 18 ? '下午好' : '晚上好';
const vitalRate = statsData.healthDataStats?.vital_signs_report_rate?.report_rate;
const formattedVitalRate = vitalRate != null ? Math.round(vitalRate * 100) / 100 : 0;
const statCards = [
{ label: '今日活跃用户', value: statsData.healthDataStats?.vital_signs_report_rate?.report_rate ?? 0, color: '#2563EB', trend: '', trendDir: '' },
{ label: '科普阅读量', value: articleStats?.total_views ?? statsData.pointsStats?.total_issued ?? 0, color: '#16A34A', trend: '', trendDir: 'up' },
{ label: '今日活跃用户', value: statsData.pointsStats?.active_accounts ?? 0, color: '#2563EB', trend: '', trendDir: '' },
{ label: '科普阅读量', value: articleStats?.total_views ?? 0, color: '#16A34A', trend: '', trendDir: 'up' },
{ label: '积分发放', value: statsData.pointsStats?.total_issued ?? 0, color: '#EA580C', trend: '', trendDir: 'down' },
{ label: '待审核订单', value: stats?.total_pending ?? 0, color: '#E11D48', trend: '', trendDir: 'down' },
];
@@ -77,7 +80,7 @@ export default function OperatorWorkbench() {
<div style={{ fontSize: 20, fontWeight: 700, marginBottom: 14, position: 'relative', zIndex: 1 }}>{stats?.total_pending ?? 0} </div>
<div style={{ fontSize: 13, lineHeight: 2, opacity: 0.92, position: 'relative', zIndex: 1 }}>
<b style={{ color: '#FED7AA', fontWeight: 600 }}>1. </b> {statsData.pointsStats?.total_issued ?? 0} {statsData.pointsStats?.total_spent ?? 0}<br />
<b style={{ color: '#FED7AA', fontWeight: 600 }}>2. </b> {statsData.healthDataStats?.vital_signs_report_rate?.report_rate ?? 0}%<br />
<b style={{ color: '#FED7AA', fontWeight: 600 }}>2. </b> {formattedVitalRate}%<br />
<b style={{ color: '#FED7AA', fontWeight: 600 }}>3. </b> {stats?.total_pending ?? 0} {stats?.urgent_alerts ?? 0}
</div>
<div style={{ display: 'flex', gap: 8, marginTop: 16, position: 'relative', zIndex: 1, flexWrap: 'wrap' as const }}>