diff --git a/.lintstagedrc.js b/.lintstagedrc.js index a2b0825..77606ff 100644 --- a/.lintstagedrc.js +++ b/.lintstagedrc.js @@ -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', ], diff --git a/apps/web/src/pages/Home.tsx b/apps/web/src/pages/Home.tsx index 1b7cc69..db243d0 100644 --- a/apps/web/src/pages/Home.tsx +++ b/apps/web/src/pages/Home.tsx @@ -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 = { { key: 'issued', title: '积分发放', getValue: (_p, s) => s.pointsStats?.total_issued ?? 0, icon: , path: '/health/points' }, { key: 'spent', title: '积分消费', getValue: (_p, s) => s.pointsStats?.total_spent ?? 0, icon: , path: '/health/mall' }, { key: 'active', title: '活跃账户', getValue: (_p, s) => s.pointsStats?.active_accounts ?? 0, icon: , path: '/health/points' }, - { key: 'articles', title: '内容发布', getValue: (_p, s) => s.pointsStats?.total_issued ?? 0, icon: , path: '/health/content' }, + { key: 'articles', title: '内容发布', getValue: (_p, s) => s.patientStats?.total_patients ?? 0, icon: , path: '/health/content' }, ], }; diff --git a/apps/web/src/pages/health/components/workbench/OperatorWorkbench.tsx b/apps/web/src/pages/health/components/workbench/OperatorWorkbench.tsx index 855021b..21b9177 100644 --- a/apps/web/src/pages/health/components/workbench/OperatorWorkbench.tsx +++ b/apps/web/src/pages/health/components/workbench/OperatorWorkbench.tsx @@ -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() {
{stats?.total_pending ?? 0} 个运营洞察需要关注
1. 积分兑换活动数据 — 今日发放 {statsData.pointsStats?.total_issued ?? 0} 积分,消费 {statsData.pointsStats?.total_spent ?? 0}。
- 2. 患者活跃度 — 体征上报率 {statsData.healthDataStats?.vital_signs_report_rate?.report_rate ?? 0}%,持续关注沉默用户。
+ 2. 患者活跃度 — 体征上报率 {formattedVitalRate}%,持续关注沉默用户。
3. 待处理任务 — {stats?.total_pending ?? 0} 项任务待处理,其中 {stats?.urgent_alerts ?? 0} 项需优先关注。